stifle /0 warnings in TF invert

No path through allows an infinite term in the inverse.
It's all funneled through tf_is_valid().

Bug: oss-fuzz:12430, oss-fuzz:12426
Change-Id: Id65cada5dceb7c18c1ff86ae29d012e86db98972
Reviewed-on: https://skia-review.googlesource.com/c/182072
Auto-Submit: Mike Klein <mtklein@google.com>
Commit-Queue: Brian Osman <brianosman@google.com>
Reviewed-by: Brian Osman <brianosman@google.com>
diff --git a/profiles/fuzz/zero_g.icc b/profiles/fuzz/zero_g.icc
new file mode 100644
index 0000000..dbd1202
--- /dev/null
+++ b/profiles/fuzz/zero_g.icc
Binary files differ
diff --git a/profiles/fuzz/zero_g.icc.txt b/profiles/fuzz/zero_g.icc.txt
new file mode 100644
index 0000000..8577aab
--- /dev/null
+++ b/profiles/fuzz/zero_g.icc.txt
@@ -0,0 +1,38 @@
+                Size : 0x00000090 : 144
+    Data color space : 0x47524159 : 'GRAY'
+                 PCS : 0x58595A20 : 'XYZ '
+           Tag count : 0x00000001 : 1
+
+ Tag    : Type   : Size   : Offset
+ ------ : ------ : ------ : --------
+ 'kTRC' : 'curv' :     32 : 104
+
+rTRC : 0, 1, 0, 0, 0, 0, 0
+gTRC : 0, 1, 0, 0, 0, 0, 0
+bTRC : 0, 1, 0, 0, 0, 0, 0
+ XYZ : | 0.961425781 0.000000000 0.000000000 |
+       | 0.000000000 1.000488281 0.000000000 |
+       | 0.000000000 0.000000000 0.832519531 |
+252 random bytes transformed to linear XYZD50 bytes:
+	f5ffd4 f5ffd4 f5ffd4 f5ffd4 f5ffd4 f5ffd4 f5ffd4
+	f5ffd4 f5ffd4 f5ffd4 f5ffd4 f5ffd4 f5ffd4 f5ffd4
+	f5ffd4 f5ffd4 f5ffd4 f5ffd4 f5ffd4 f5ffd4 f5ffd4
+	f5ffd4 f5ffd4 f5ffd4 f5ffd4 f5ffd4 f5ffd4 f5ffd4
+	f5ffd4 f5ffd4 f5ffd4 f5ffd4 f5ffd4 f5ffd4 f5ffd4
+	f5ffd4 f5ffd4 f5ffd4 f5ffd4 f5ffd4 f5ffd4 f5ffd4
+	f5ffd4 f5ffd4 f5ffd4 f5ffd4 f5ffd4 f5ffd4 f5ffd4
+	f5ffd4 f5ffd4 f5ffd4 f5ffd4 f5ffd4 f5ffd4 f5ffd4
+	f5ffd4 f5ffd4 f5ffd4 f5ffd4 f5ffd4 f500d4 f5ffd4
+	f5ffd4 f5ffd4 f5ffd4 f5ffd4 f5ffd4 f5ffd4 f5ffd4
+	f5ffd4 f5ffd4 f5ffd4 f5ffd4 f5ffd4 f5ffd4 f5ffd4
+	f5ffd4 f5ffd4 f5ffd4 f5ffd4 f5ffd4 f5ffd4 f5ffd4
+81 edge-case pixels transformed to sRGB 8888 (unpremul):
+	00000000 004a00ff 004a00ff  0000ff00 0000fcff 0000fcff  0000ff00 0000fcff 0000fcff
+	00ff2e00 00ff00ff 00ff00ff  00f8ff00 00fffffd 00fffffd  00f8ff00 00fffffd 00fffffd
+	00ff2e00 00ff00ff 00ff00ff  00f8ff00 00fffffd 00fffffd  00f8ff00 00fffffd 00fffffd
+	7f000000 7f4a00ff 7f4a00ff  7f00ff00 7f00fcff 7f00fcff  7f00ff00 7f00fcff 7f00fcff
+	7fff2e00 7fff00ff 7fff00ff  7ff8ff00 7ffffffd 7ffffffd  7ff8ff00 7ffffffd 7ffffffd
+	7fff2e00 7fff00ff 7fff00ff  7ff8ff00 7ffffffd 7ffffffd  7ff8ff00 7ffffffd 7ffffffd
+	ff000000 ff4a00ff ff4a00ff  ff00ff00 ff00fcff ff00fcff  ff00ff00 ff00fcff ff00fcff
+	ffff2e00 ffff00ff ffff00ff  fff8ff00 fffffffd fffffffd  fff8ff00 fffffffd fffffffd
+	ffff2e00 ffff00ff ffff00ff  fff8ff00 fffffffd fffffffd  fff8ff00 fffffffd fffffffd
diff --git a/skcms.cc b/skcms.cc
index c2617d3..19ea5a2 100644
--- a/skcms.cc
+++ b/skcms.cc
@@ -1403,6 +1403,9 @@
                              : powf_(tf->a * x + tf->b, tf->g) + tf->e);
 }
 
+#if defined(__clang__)
+    [[clang::no_sanitize("float-divide-by-zero")]]  // Checked for by tf_is_valid() on the way out.
+#endif
 bool skcms_TransferFunction_invert(const skcms_TransferFunction* src, skcms_TransferFunction* dst) {
     if (!tf_is_valid(src)) {
         return false;
diff --git a/tests.c b/tests.c
index ad3ef83..c6ae8a8 100644
--- a/tests.c
+++ b/tests.c
@@ -601,6 +601,9 @@
 
     // This calibrated profile has a non-zero black.
     "profiles/misc/calibrated_nonzero_black.icc",
+
+    // A zero g term causes a divide by zero when inverting.
+    "profiles/fuzz/zero_g.icc",                       // oss-fuzz:12430
 };
 
 static void test_Parse(bool regen) {