aaron.ballman added inline comments.

================
Comment at: clang/docs/ReleaseNotes.rst:229-231
+- Introduced ``-Wcast-function-type-strict`` to warn about function type 
mismatches
+  in casts that may result in runtime indirect call `Control-Flow Integrity 
(CFI)
+  <https://clang.llvm.org/docs/ControlFlowIntegrity.html>`_ failures.
----------------



================
Comment at: clang/test/Sema/warn-cast-function-type-strict.c:30
+  g = (f7 *)x; /* expected-warning {{cast from 'int (*)(long)' to 'f7 *' (aka 
'int (*)(long, ...)') converts to incompatible function type}} */
+}
----------------
samitolvanen wrote:
> aaron.ballman wrote:
> > Some other test cases I think we should try out:
> > ```
> > typedef int (f8)(int *);
> > typedef int (f9)(const int);
> > typedef int (f10)(int);
> > 
> > int foo(int array[static 12]);
> > int bar(int i);
> > const int baz(int i);
> > 
> > f8 *h = (f8 *)foo; // Should be okay, types are the same after adjustment
> > f9 *i = (f9 *)bar; // Should be okay, types are the same after adjustment
> > f10 *j = (f10 *)baz; // Should be okay, types are the same after adjustment
> > ```
> The first two seem to be OK, the last one does produce a warning here:
> ```
> cast from 'const int (*)(int)' to 'f10 *' (aka 'int (*)(int)') converts to 
> incompatible function type
> ```
Oh yeah, that's right, the C standard is pretty weird here. The return type is 
required to be compatible (aka same type in this case) per C2x 6.7.6.3p14, and 
`int` and `const int` are not compatible types (C2x 6.7.3p11). However, the 
qualifier on the return type is useless because it's stripped when the function 
is called (C2x 6.5.2.2p5, 6.8.6.4p3, 6.5.16p3, 6.3.2.1p2).

Compilers are wildly inconsistent about this: https://godbolt.org/z/hc6ordGeM


================
Comment at: clang/test/SemaCXX/warn-cast-function-type-strict.cpp:1
+// RUN: %clang_cc1 -x c++ %s -fblocks -fsyntax-only 
-Wcast-function-type-strict -triple x86_64-- -verify
+
----------------
aaron.ballman wrote:
> Same question about triples here.
You should remove the `-x c++` from the RUN line still.


================
Comment at: clang/test/SemaCXX/warn-cast-function-type.cpp:1
-// RUN: %clang_cc1 -x c++ %s -fblocks -fsyntax-only -Wcast-function-type 
-triple x86_64-- -verify
+// RUN: %clang_cc1 -x c++ %s -fblocks -fsyntax-only -Wcast-function-type 
-Wno-cast-function-type-strict -verify
 
----------------



Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D134831/new/

https://reviews.llvm.org/D134831

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to