Index: clang/test/Analysis/Checkers/StrictAliasingChecker/enam-ptr-to-scalar.cpp =================================================================== --- /dev/null +++ clang/test/Analysis/Checkers/StrictAliasingChecker/enam-ptr-to-scalar.cpp @@ -0,0 +1,150 @@ +// RUN: %clang_cc1 -std=c++20 -analyze -analyzer-config eagerly-assume=false -analyzer-checker=debug.ExprInspection,alpha.core.StrictAliasing -verify %s +// NOTE: -relaxed-aliasing flag disables StrictAliasing checker. + +#include "enums.h" + +template +T *create() { return new T; } + +#define CHECK(var, type) \ + { auto y = *(type *)var; } + +#define CHECKS_NO_WARN \ + CHECK(x, char) \ + CHECK(x, unsigned char) + +#define CHECKS \ + CHECK(x, bool) \ + CHECK(x, short) \ + CHECK(x, int) \ + CHECK(x, long) \ + CHECK(x, long long) \ + CHECK(x, signed char) \ + CHECK(x, unsigned short) \ + CHECK(x, unsigned int) \ + CHECK(x, unsigned long) \ + CHECK(x, unsigned long long) \ + CHECK(x, float) \ + CHECK(x, double) \ + CHECK(x, long double) + +void std_byte_test() { + auto *x = create(); + CHECKS_NO_WARN // no-warning + CHECKS // expected-warning 13{{Undefined behavior}} +} + +void std_OtherByte_test() { + auto *x = create(); + CHECKS_NO_WARN // no-warning + CHECKS // expected-warning 13{{Undefined behavior}} +} + +void ClassEnum_test() { + auto *x = create(); + CHECKS_NO_WARN // no-warning + CHECKS // expected-warning 13{{Undefined behavior}} +} + +void ClassEnumChar_test() { + auto *x = create(); + CHECKS_NO_WARN // no-warning + CHECKS // expected-warning 13{{Undefined behavior}} +} + +void ClassEnumUChar_test() { + auto *x = create(); + CHECKS_NO_WARN // no-warning + CHECKS // expected-warning 13{{Undefined behavior}} +} + +void ClassEnumInt_test() { + auto *x = create(); + CHECKS_NO_WARN // no-warning + CHECKS // expected-warning 13{{Undefined behavior}} +} + +void Enum_test() { + auto *x = create(); + CHECKS_NO_WARN // no-warning + CHECKS // expected-warning 13{{Undefined behavior}} +} + +void EnumChar_test() { + auto *x = create(); + CHECKS_NO_WARN // no-warning + CHECKS // expected-warning 13{{Undefined behavior}} +} + +void EnumUChar_test() { + auto *x = create(); + CHECKS_NO_WARN // no-warning + CHECKS // expected-warning 13{{Undefined behavior}} +} + +void EnumInt_test() { + auto *x = create(); + CHECKS_NO_WARN // no-warning + CHECKS // expected-warning 13{{Undefined behavior}} +} + +void E_Dummy_test() { + auto *x = create(); + CHECKS_NO_WARN // no-warning + CHECKS // expected-warning 13{{Undefined behavior}} +} + +void std_byte_test(std::byte *x) { + CHECKS_NO_WARN // no-warning + CHECKS // expected-warning 13{{Undefined behavior}} +} + +void std_OtherByte_test(std::OtherByte *x) { + CHECKS_NO_WARN // no-warning + CHECKS // expected-warning 13{{Undefined behavior}} +} + +void ClassEnum_test(ClassEnum *x) { + CHECKS_NO_WARN // no-warning + CHECKS // expected-warning 13{{Undefined behavior}} +} + +void ClassEnumChar_test(ClassEnumChar *x) { + CHECKS_NO_WARN // no-warning + CHECKS // expected-warning 13{{Undefined behavior}} +} + +void ClassEnumUChar_test(ClassEnumUChar *x) { + CHECKS_NO_WARN // no-warning + CHECKS // expected-warning 13{{Undefined behavior}} +} + +void ClassEnumInt_test(ClassEnumInt *x) { + CHECKS_NO_WARN // no-warning + CHECKS // expected-warning 13{{Undefined behavior}} +} + +void Enum_test(Enum *x) { + CHECKS_NO_WARN // no-warning + CHECKS // expected-warning 13{{Undefined behavior}} +} + +void EnumChar_test(EnumChar *x) { + CHECKS_NO_WARN // no-warning + CHECKS // expected-warning 13{{Undefined behavior}} +} + +void EnumUChar_test(EnumUChar *x) { + CHECKS_NO_WARN // no-warning + CHECKS // expected-warning 13{{Undefined behavior}} +} + +void EnumInt_test(EnumInt *x) { + CHECKS_NO_WARN // no-warning + CHECKS // expected-warning 13{{Undefined behavior}} +} + +void E_Dummy_test(decltype(E_Dummy) *x) { + CHECKS_NO_WARN // no-warning + CHECKS // expected-warning 13{{Undefined behavior}} +} Index: clang/test/Analysis/Checkers/StrictAliasingChecker/enam-var-to-scalar.cpp =================================================================== --- /dev/null +++ clang/test/Analysis/Checkers/StrictAliasingChecker/enam-var-to-scalar.cpp @@ -0,0 +1,147 @@ +// RUN: %clang_cc1 -std=c++20 -analyze -analyzer-config eagerly-assume=false -analyzer-checker=debug.ExprInspection,alpha.core.StrictAliasing -verify %s +// NOTE: -relaxed-aliasing flag disables StrictAliasing checker. + +#include "enums.h" + +#define CHECK(var, type) \ + { auto y = *(type *)&var; } + +#define CHECKS_NO_WARN \ + CHECK(x, char) \ + CHECK(x, unsigned char) + +#define CHECKS \ + CHECK(x, bool) \ + CHECK(x, short) \ + CHECK(x, int) \ + CHECK(x, long) \ + CHECK(x, long long) \ + CHECK(x, signed char) \ + CHECK(x, unsigned short) \ + CHECK(x, unsigned int) \ + CHECK(x, unsigned long) \ + CHECK(x, unsigned long long) \ + CHECK(x, float) \ + CHECK(x, double) \ + CHECK(x, long double) + +void std_byte_test() { + std::byte x{}; + CHECKS_NO_WARN // no-warning + CHECKS // expected-warning 13{{Undefined behavior}} +} + +void std_OtherByte_test() { + std::OtherByte x{}; + CHECKS_NO_WARN // no-warning + CHECKS // expected-warning 13{{Undefined behavior}} +} + +void ClassEnum_test() { + ClassEnum x{}; + CHECKS_NO_WARN // no-warning + CHECKS // expected-warning 13{{Undefined behavior}} +} + +void ClassEnumChar_test() { + ClassEnumChar x{}; + CHECKS_NO_WARN // no-warning + CHECKS // expected-warning 13{{Undefined behavior}} +} + +void ClassEnumUChar_test() { + ClassEnumUChar x{}; + CHECKS_NO_WARN // no-warning + CHECKS // expected-warning 13{{Undefined behavior}} +} + +void ClassEnumInt_test() { + ClassEnumInt x{}; + CHECKS_NO_WARN // no-warning + CHECKS // expected-warning 13{{Undefined behavior}} +} + +void Enum_test() { + Enum x{}; + CHECKS_NO_WARN // no-warning + CHECKS // expected-warning 13{{Undefined behavior}} +} + +void EnumChar_test() { + EnumChar x{}; + CHECKS_NO_WARN // no-warning + CHECKS // expected-warning 13{{Undefined behavior}} +} + +void EnumUChar_test() { + EnumUChar x{}; + CHECKS_NO_WARN // no-warning + CHECKS // expected-warning 13{{Undefined behavior}} +} + +void EnumInt_test() { + EnumInt x{}; + CHECKS_NO_WARN // no-warning + CHECKS // expected-warning 13{{Undefined behavior}} +} + +void E_Dummy_test() { + decltype(E_Dummy) x{}; + CHECKS_NO_WARN // no-warning + CHECKS // expected-warning 13{{Undefined behavior}} +} + +void std_byte_test(std::byte x) { + CHECKS_NO_WARN // no-warning + CHECKS // expected-warning 13{{Undefined behavior}} +} + +void std_OtherByte_test(std::OtherByte x) { + CHECKS_NO_WARN // no-warning + CHECKS // expected-warning 13{{Undefined behavior}} +} + +void ClassEnum_test(ClassEnum x) { + CHECKS_NO_WARN // no-warning + CHECKS // expected-warning 13{{Undefined behavior}} +} + +void ClassEnumChar_test(ClassEnumChar x) { + CHECKS_NO_WARN // no-warning + CHECKS // expected-warning 13{{Undefined behavior}} +} + +void ClassEnumUChar_test(ClassEnumUChar x) { + CHECKS_NO_WARN // no-warning + CHECKS // expected-warning 13{{Undefined behavior}} +} + +void ClassEnumInt_test(ClassEnumInt x) { + CHECKS_NO_WARN // no-warning + CHECKS // expected-warning 13{{Undefined behavior}} +} + +void Enum_test(Enum x) { + CHECKS_NO_WARN // no-warning + CHECKS // expected-warning 13{{Undefined behavior}} +} + +void EnumChar_test(EnumChar x) { + CHECKS_NO_WARN // no-warning + CHECKS // expected-warning 13{{Undefined behavior}} +} + +void EnumUChar_test(EnumUChar x) { + CHECKS_NO_WARN // no-warning + CHECKS // expected-warning 13{{Undefined behavior}} +} + +void EnumInt_test(EnumInt x) { + CHECKS_NO_WARN // no-warning + CHECKS // expected-warning 13{{Undefined behavior}} +} + +void E_Dummy_test(decltype(E_Dummy) x) { + CHECKS_NO_WARN // no-warning + CHECKS // expected-warning 13{{Undefined behavior}} +} Index: clang/test/Analysis/Checkers/StrictAliasingChecker/enum-ptr-to-enum.cpp =================================================================== --- /dev/null +++ clang/test/Analysis/Checkers/StrictAliasingChecker/enum-ptr-to-enum.cpp @@ -0,0 +1,329 @@ +// RUN: %clang_cc1 -std=c++20 -analyze -analyzer-config eagerly-assume=false -analyzer-checker=debug.ExprInspection,alpha.core.StrictAliasing -verify %s +// NOTE: -relaxed-aliasing flag disables StrictAliasing checker. + +#include "enums.h" + +template +T *create() { return new T{}; } + +#define CHECK(var, type) \ + { auto y = *(type *)var; } + +void std_byte_test() { + auto *x = create(); + CHECK(x, std::byte) // no-warning + CHECK(x, std::OtherByte) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnum) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumChar) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumUChar) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumInt) // expected-warning {{Undefined behavior}} + CHECK(x, Enum) // expected-warning {{Undefined behavior}} + CHECK(x, EnumChar) // expected-warning {{Undefined behavior}} + CHECK(x, EnumUChar) // expected-warning {{Undefined behavior}} + CHECK(x, EnumInt) // expected-warning {{Undefined behavior}} + CHECK(x, decltype(E_Dummy)) // expected-warning {{Undefined behavior}} +} + +void std_OtherByte_test() { + auto *x = create(); + CHECK(x, std::byte) // no-warning + CHECK(x, std::OtherByte) // no-warning + CHECK(x, ClassEnum) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumChar) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumUChar) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumInt) // expected-warning {{Undefined behavior}} + CHECK(x, Enum) // expected-warning {{Undefined behavior}} + CHECK(x, EnumChar) // expected-warning {{Undefined behavior}} + CHECK(x, EnumUChar) // expected-warning {{Undefined behavior}} + CHECK(x, EnumInt) // expected-warning {{Undefined behavior}} + CHECK(x, decltype(E_Dummy)) // expected-warning {{Undefined behavior}} +} + +void ClassEnum_test() { + auto *x = create(); + CHECK(x, std::byte) // no-warning + CHECK(x, std::OtherByte) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnum) // no-warning + CHECK(x, ClassEnumChar) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumUChar) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumInt) // expected-warning {{Undefined behavior}} + CHECK(x, Enum) // expected-warning {{Undefined behavior}} + CHECK(x, EnumChar) // expected-warning {{Undefined behavior}} + CHECK(x, EnumUChar) // expected-warning {{Undefined behavior}} + CHECK(x, EnumInt) // expected-warning {{Undefined behavior}} + CHECK(x, decltype(E_Dummy)) // expected-warning {{Undefined behavior}} +} + +void ClassEnumChar_test() { + auto *x = create(); + CHECK(x, std::byte) // no-warning + CHECK(x, std::OtherByte) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnum) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumChar) // no-warning + CHECK(x, ClassEnumUChar) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumInt) // expected-warning {{Undefined behavior}} + CHECK(x, Enum) // expected-warning {{Undefined behavior}} + CHECK(x, EnumChar) // expected-warning {{Undefined behavior}} + CHECK(x, EnumUChar) // expected-warning {{Undefined behavior}} + CHECK(x, EnumInt) // expected-warning {{Undefined behavior}} + CHECK(x, decltype(E_Dummy)) // expected-warning {{Undefined behavior}} +} + +void ClassEnumUChar_test() { + auto *x = create(); + CHECK(x, std::byte) // no-warning + CHECK(x, std::OtherByte) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnum) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumChar) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumUChar) // no-warning + CHECK(x, ClassEnumInt) // expected-warning {{Undefined behavior}} + CHECK(x, Enum) // expected-warning {{Undefined behavior}} + CHECK(x, EnumChar) // expected-warning {{Undefined behavior}} + CHECK(x, EnumUChar) // expected-warning {{Undefined behavior}} + CHECK(x, EnumInt) // expected-warning {{Undefined behavior}} + CHECK(x, decltype(E_Dummy)) // expected-warning {{Undefined behavior}} +} + +void ClassEnumInt_test() { + auto *x = create(); + CHECK(x, std::byte) // no-warning + CHECK(x, std::OtherByte) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnum) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumChar) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumUChar) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumInt) // no-warning + CHECK(x, Enum) // expected-warning {{Undefined behavior}} + CHECK(x, EnumChar) // expected-warning {{Undefined behavior}} + CHECK(x, EnumUChar) // expected-warning {{Undefined behavior}} + CHECK(x, EnumInt) // expected-warning {{Undefined behavior}} + CHECK(x, decltype(E_Dummy)) // expected-warning {{Undefined behavior}} +} + +void Enum_test() { + auto *x = create(); + CHECK(x, std::byte) // no-warning + CHECK(x, std::OtherByte) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnum) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumChar) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumUChar) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumInt) // expected-warning {{Undefined behavior}} + CHECK(x, Enum) // no-warning + CHECK(x, EnumChar) // expected-warning {{Undefined behavior}} + CHECK(x, EnumUChar) // expected-warning {{Undefined behavior}} + CHECK(x, EnumInt) // expected-warning {{Undefined behavior}} + CHECK(x, decltype(E_Dummy)) // expected-warning {{Undefined behavior}} +} + +void EnumChar_test() { + auto *x = create(); + CHECK(x, std::byte) // no-warning + CHECK(x, std::OtherByte) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnum) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumChar) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumUChar) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumInt) // expected-warning {{Undefined behavior}} + CHECK(x, Enum) // expected-warning {{Undefined behavior}} + CHECK(x, EnumChar) // no-warning + CHECK(x, EnumUChar) // expected-warning {{Undefined behavior}} + CHECK(x, EnumInt) // expected-warning {{Undefined behavior}} + CHECK(x, decltype(E_Dummy)) // expected-warning {{Undefined behavior}} +} + +void EnumUChar_test() { + auto *x = create(); + CHECK(x, std::byte) // no-warning + CHECK(x, std::OtherByte) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnum) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumChar) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumUChar) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumInt) // expected-warning {{Undefined behavior}} + CHECK(x, Enum) // expected-warning {{Undefined behavior}} + CHECK(x, EnumChar) // expected-warning {{Undefined behavior}} + CHECK(x, EnumUChar) // no-warning + CHECK(x, EnumInt) // expected-warning {{Undefined behavior}} + CHECK(x, decltype(E_Dummy)) // expected-warning {{Undefined behavior}} +} + +void EnumInt_test() { + auto *x = create(); + CHECK(x, std::byte) // no-warning + CHECK(x, std::OtherByte) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnum) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumChar) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumUChar) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumInt) // expected-warning {{Undefined behavior}} + CHECK(x, Enum) // expected-warning {{Undefined behavior}} + CHECK(x, EnumChar) // expected-warning {{Undefined behavior}} + CHECK(x, EnumUChar) // expected-warning {{Undefined behavior}} + CHECK(x, EnumInt) // no-warning + CHECK(x, decltype(E_Dummy)) // expected-warning {{Undefined behavior}} +} + +void E_Dummy_test() { + auto *x = create(); + CHECK(x, std::byte) // no-warning + CHECK(x, std::OtherByte) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnum) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumChar) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumUChar) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumInt) // expected-warning {{Undefined behavior}} + CHECK(x, Enum) // expected-warning {{Undefined behavior}} + CHECK(x, EnumChar) // expected-warning {{Undefined behavior}} + CHECK(x, EnumUChar) // expected-warning {{Undefined behavior}} + CHECK(x, EnumInt) // expected-warning {{Undefined behavior}} + CHECK(x, decltype(E_Dummy)) // no-warning +} + +void std_byte_test(std::byte *x) { + CHECK(x, std::byte) // no-warning + CHECK(x, std::OtherByte) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnum) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumChar) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumUChar) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumInt) // expected-warning {{Undefined behavior}} + CHECK(x, Enum) // expected-warning {{Undefined behavior}} + CHECK(x, EnumChar) // expected-warning {{Undefined behavior}} + CHECK(x, EnumUChar) // expected-warning {{Undefined behavior}} + CHECK(x, EnumInt) // expected-warning {{Undefined behavior}} + CHECK(x, decltype(E_Dummy)) // expected-warning {{Undefined behavior}} +} + +void std_OtherByte_test(std::OtherByte *x) { + CHECK(x, std::byte) // no-warning + CHECK(x, std::OtherByte) // no-warning + CHECK(x, ClassEnum) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumChar) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumUChar) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumInt) // expected-warning {{Undefined behavior}} + CHECK(x, Enum) // expected-warning {{Undefined behavior}} + CHECK(x, EnumChar) // expected-warning {{Undefined behavior}} + CHECK(x, EnumUChar) // expected-warning {{Undefined behavior}} + CHECK(x, EnumInt) // expected-warning {{Undefined behavior}} + CHECK(x, decltype(E_Dummy)) // expected-warning {{Undefined behavior}} +} + +void ClassEnum_test(ClassEnum *x) { + CHECK(x, std::byte) // no-warning + CHECK(x, std::OtherByte) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnum) // no-warning + CHECK(x, ClassEnumChar) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumUChar) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumInt) // expected-warning {{Undefined behavior}} + CHECK(x, Enum) // expected-warning {{Undefined behavior}} + CHECK(x, EnumChar) // expected-warning {{Undefined behavior}} + CHECK(x, EnumUChar) // expected-warning {{Undefined behavior}} + CHECK(x, EnumInt) // expected-warning {{Undefined behavior}} + CHECK(x, decltype(E_Dummy)) // expected-warning {{Undefined behavior}} +} + +void ClassEnumChar_test(ClassEnumChar *x) { + CHECK(x, std::byte) // no-warning + CHECK(x, std::OtherByte) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnum) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumChar) // no-warning + CHECK(x, ClassEnumUChar) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumInt) // expected-warning {{Undefined behavior}} + CHECK(x, Enum) // expected-warning {{Undefined behavior}} + CHECK(x, EnumChar) // expected-warning {{Undefined behavior}} + CHECK(x, EnumUChar) // expected-warning {{Undefined behavior}} + CHECK(x, EnumInt) // expected-warning {{Undefined behavior}} + CHECK(x, decltype(E_Dummy)) // expected-warning {{Undefined behavior}} +} + +void ClassEnumUChar_test(ClassEnumUChar *x) { + CHECK(x, std::byte) // no-warning + CHECK(x, std::OtherByte) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnum) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumChar) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumUChar) // no-warning + CHECK(x, ClassEnumInt) // expected-warning {{Undefined behavior}} + CHECK(x, Enum) // expected-warning {{Undefined behavior}} + CHECK(x, EnumChar) // expected-warning {{Undefined behavior}} + CHECK(x, EnumUChar) // expected-warning {{Undefined behavior}} + CHECK(x, EnumInt) // expected-warning {{Undefined behavior}} + CHECK(x, decltype(E_Dummy)) // expected-warning {{Undefined behavior}} +} + +void ClassEnumInt_test(ClassEnumInt *x) { + CHECK(x, std::byte) // no-warning + CHECK(x, std::OtherByte) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnum) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumChar) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumUChar) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumInt) // no-warning + CHECK(x, Enum) // expected-warning {{Undefined behavior}} + CHECK(x, EnumChar) // expected-warning {{Undefined behavior}} + CHECK(x, EnumUChar) // expected-warning {{Undefined behavior}} + CHECK(x, EnumInt) // expected-warning {{Undefined behavior}} + CHECK(x, decltype(E_Dummy)) // expected-warning {{Undefined behavior}} +} + +void Enum_test(Enum *x) { + CHECK(x, std::byte) // no-warning + CHECK(x, std::OtherByte) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnum) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumChar) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumUChar) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumInt) // expected-warning {{Undefined behavior}} + CHECK(x, Enum) // no-warning + CHECK(x, EnumChar) // expected-warning {{Undefined behavior}} + CHECK(x, EnumUChar) // expected-warning {{Undefined behavior}} + CHECK(x, EnumInt) // expected-warning {{Undefined behavior}} + CHECK(x, decltype(E_Dummy)) // expected-warning {{Undefined behavior}} +} + +void EnumChar_test(EnumChar *x) { + CHECK(x, std::byte) // no-warning + CHECK(x, std::OtherByte) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnum) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumChar) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumUChar) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumInt) // expected-warning {{Undefined behavior}} + CHECK(x, Enum) // expected-warning {{Undefined behavior}} + CHECK(x, EnumChar) // no-warning + CHECK(x, EnumUChar) // expected-warning {{Undefined behavior}} + CHECK(x, EnumInt) // expected-warning {{Undefined behavior}} + CHECK(x, decltype(E_Dummy)) // expected-warning {{Undefined behavior}} +} + +void EnumUChar_test(EnumUChar *x) { + CHECK(x, std::byte) // no-warning + CHECK(x, std::OtherByte) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnum) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumChar) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumUChar) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumInt) // expected-warning {{Undefined behavior}} + CHECK(x, Enum) // expected-warning {{Undefined behavior}} + CHECK(x, EnumChar) // expected-warning {{Undefined behavior}} + CHECK(x, EnumUChar) // no-warning + CHECK(x, EnumInt) // expected-warning {{Undefined behavior}} + CHECK(x, decltype(E_Dummy)) // expected-warning {{Undefined behavior}} +} + +void EnumInt_test(EnumInt *x) { + CHECK(x, std::byte) // no-warning + CHECK(x, std::OtherByte) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnum) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumChar) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumUChar) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumInt) // expected-warning {{Undefined behavior}} + CHECK(x, Enum) // expected-warning {{Undefined behavior}} + CHECK(x, EnumChar) // expected-warning {{Undefined behavior}} + CHECK(x, EnumUChar) // expected-warning {{Undefined behavior}} + CHECK(x, EnumInt) // no-warning + CHECK(x, decltype(E_Dummy)) // expected-warning {{Undefined behavior}} +} + +void E_Dummy_test(decltype(E_Dummy) *x) { + CHECK(x, std::byte) // no-warning + CHECK(x, std::OtherByte) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnum) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumChar) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumUChar) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumInt) // expected-warning {{Undefined behavior}} + CHECK(x, Enum) // expected-warning {{Undefined behavior}} + CHECK(x, EnumChar) // expected-warning {{Undefined behavior}} + CHECK(x, EnumUChar) // expected-warning {{Undefined behavior}} + CHECK(x, EnumInt) // expected-warning {{Undefined behavior}} + CHECK(x, decltype(E_Dummy)) // no-warning +} Index: clang/test/Analysis/Checkers/StrictAliasingChecker/enum-var-to-enum.cpp =================================================================== --- /dev/null +++ clang/test/Analysis/Checkers/StrictAliasingChecker/enum-var-to-enum.cpp @@ -0,0 +1,326 @@ +// RUN: %clang_cc1 -std=c++20 -analyze -analyzer-config eagerly-assume=false -analyzer-checker=debug.ExprInspection,alpha.core.StrictAliasing -verify %s +// NOTE: -relaxed-aliasing flag disables StrictAliasing checker. + +#include "enums.h" + +#define CHECK(var, type) \ + { auto y = *(type *)&var; } + +void std_byte_test() { + std::byte x{}; + CHECK(x, std::byte) // no-warning + CHECK(x, std::OtherByte) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnum) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumChar) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumUChar) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumInt) // expected-warning {{Undefined behavior}} + CHECK(x, Enum) // expected-warning {{Undefined behavior}} + CHECK(x, EnumChar) // expected-warning {{Undefined behavior}} + CHECK(x, EnumUChar) // expected-warning {{Undefined behavior}} + CHECK(x, EnumInt) // expected-warning {{Undefined behavior}} + CHECK(x, decltype(E_Dummy)) // expected-warning {{Undefined behavior}} +} + +void std_OtherByte_test() { + std::OtherByte x{}; + CHECK(x, std::byte) // no-warning + CHECK(x, std::OtherByte) // no-warning + CHECK(x, ClassEnum) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumChar) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumUChar) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumInt) // expected-warning {{Undefined behavior}} + CHECK(x, Enum) // expected-warning {{Undefined behavior}} + CHECK(x, EnumChar) // expected-warning {{Undefined behavior}} + CHECK(x, EnumUChar) // expected-warning {{Undefined behavior}} + CHECK(x, EnumInt) // expected-warning {{Undefined behavior}} + CHECK(x, decltype(E_Dummy)) // expected-warning {{Undefined behavior}} +} + +void ClassEnum_test() { + ClassEnum x{}; + CHECK(x, std::byte) // no-warning + CHECK(x, std::OtherByte) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnum) // no-warning + CHECK(x, ClassEnumChar) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumUChar) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumInt) // expected-warning {{Undefined behavior}} + CHECK(x, Enum) // expected-warning {{Undefined behavior}} + CHECK(x, EnumChar) // expected-warning {{Undefined behavior}} + CHECK(x, EnumUChar) // expected-warning {{Undefined behavior}} + CHECK(x, EnumInt) // expected-warning {{Undefined behavior}} + CHECK(x, decltype(E_Dummy)) // expected-warning {{Undefined behavior}} +} + +void ClassEnumChar_test() { + ClassEnumChar x{}; + CHECK(x, std::byte) // no-warning + CHECK(x, std::OtherByte) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnum) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumChar) // no-warning + CHECK(x, ClassEnumUChar) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumInt) // expected-warning {{Undefined behavior}} + CHECK(x, Enum) // expected-warning {{Undefined behavior}} + CHECK(x, EnumChar) // expected-warning {{Undefined behavior}} + CHECK(x, EnumUChar) // expected-warning {{Undefined behavior}} + CHECK(x, EnumInt) // expected-warning {{Undefined behavior}} + CHECK(x, decltype(E_Dummy)) // expected-warning {{Undefined behavior}} +} + +void ClassEnumUChar_test() { + ClassEnumUChar x{}; + CHECK(x, std::byte) // no-warning + CHECK(x, std::OtherByte) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnum) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumChar) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumUChar) // no-warning + CHECK(x, ClassEnumInt) // expected-warning {{Undefined behavior}} + CHECK(x, Enum) // expected-warning {{Undefined behavior}} + CHECK(x, EnumChar) // expected-warning {{Undefined behavior}} + CHECK(x, EnumUChar) // expected-warning {{Undefined behavior}} + CHECK(x, EnumInt) // expected-warning {{Undefined behavior}} + CHECK(x, decltype(E_Dummy)) // expected-warning {{Undefined behavior}} +} + +void ClassEnumInt_test() { + ClassEnumInt x{}; + CHECK(x, std::byte) // no-warning + CHECK(x, std::OtherByte) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnum) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumChar) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumUChar) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumInt) // no-warning + CHECK(x, Enum) // expected-warning {{Undefined behavior}} + CHECK(x, EnumChar) // expected-warning {{Undefined behavior}} + CHECK(x, EnumUChar) // expected-warning {{Undefined behavior}} + CHECK(x, EnumInt) // expected-warning {{Undefined behavior}} + CHECK(x, decltype(E_Dummy)) // expected-warning {{Undefined behavior}} +} + +void Enum_test() { + Enum x{}; + CHECK(x, std::byte) // no-warning + CHECK(x, std::OtherByte) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnum) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumChar) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumUChar) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumInt) // expected-warning {{Undefined behavior}} + CHECK(x, Enum) // no-warning + CHECK(x, EnumChar) // expected-warning {{Undefined behavior}} + CHECK(x, EnumUChar) // expected-warning {{Undefined behavior}} + CHECK(x, EnumInt) // expected-warning {{Undefined behavior}} + CHECK(x, decltype(E_Dummy)) // expected-warning {{Undefined behavior}} +} + +void EnumChar_test() { + EnumChar x{}; + CHECK(x, std::byte) // no-warning + CHECK(x, std::OtherByte) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnum) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumChar) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumUChar) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumInt) // expected-warning {{Undefined behavior}} + CHECK(x, Enum) // expected-warning {{Undefined behavior}} + CHECK(x, EnumChar) // no-warning + CHECK(x, EnumUChar) // expected-warning {{Undefined behavior}} + CHECK(x, EnumInt) // expected-warning {{Undefined behavior}} + CHECK(x, decltype(E_Dummy)) // expected-warning {{Undefined behavior}} +} + +void EnumUChar_test() { + EnumUChar x{}; + CHECK(x, std::byte) // no-warning + CHECK(x, std::OtherByte) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnum) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumChar) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumUChar) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumInt) // expected-warning {{Undefined behavior}} + CHECK(x, Enum) // expected-warning {{Undefined behavior}} + CHECK(x, EnumChar) // expected-warning {{Undefined behavior}} + CHECK(x, EnumUChar) // no-warning + CHECK(x, EnumInt) // expected-warning {{Undefined behavior}} + CHECK(x, decltype(E_Dummy)) // expected-warning {{Undefined behavior}} +} + +void EnumInt_test() { + EnumInt x{}; + CHECK(x, std::byte) // no-warning + CHECK(x, std::OtherByte) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnum) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumChar) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumUChar) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumInt) // expected-warning {{Undefined behavior}} + CHECK(x, Enum) // expected-warning {{Undefined behavior}} + CHECK(x, EnumChar) // expected-warning {{Undefined behavior}} + CHECK(x, EnumUChar) // expected-warning {{Undefined behavior}} + CHECK(x, EnumInt) // no-warning + CHECK(x, decltype(E_Dummy)) // expected-warning {{Undefined behavior}} +} + +void E_Dummy_test() { + decltype(E_Dummy) x{}; + CHECK(x, std::byte) // no-warning + CHECK(x, std::OtherByte) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnum) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumChar) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumUChar) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumInt) // expected-warning {{Undefined behavior}} + CHECK(x, Enum) // expected-warning {{Undefined behavior}} + CHECK(x, EnumChar) // expected-warning {{Undefined behavior}} + CHECK(x, EnumUChar) // expected-warning {{Undefined behavior}} + CHECK(x, EnumInt) // expected-warning {{Undefined behavior}} + CHECK(x, decltype(E_Dummy)) // no-warning +} + +void std_byte_test(std::byte x) { + CHECK(x, std::byte) // no-warning + CHECK(x, std::OtherByte) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnum) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumChar) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumUChar) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumInt) // expected-warning {{Undefined behavior}} + CHECK(x, Enum) // expected-warning {{Undefined behavior}} + CHECK(x, EnumChar) // expected-warning {{Undefined behavior}} + CHECK(x, EnumUChar) // expected-warning {{Undefined behavior}} + CHECK(x, EnumInt) // expected-warning {{Undefined behavior}} + CHECK(x, decltype(E_Dummy)) // expected-warning {{Undefined behavior}} +} + +void std_OtherByte_test(std::OtherByte x) { + CHECK(x, std::byte) // no-warning + CHECK(x, std::OtherByte) // no-warning + CHECK(x, ClassEnum) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumChar) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumUChar) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumInt) // expected-warning {{Undefined behavior}} + CHECK(x, Enum) // expected-warning {{Undefined behavior}} + CHECK(x, EnumChar) // expected-warning {{Undefined behavior}} + CHECK(x, EnumUChar) // expected-warning {{Undefined behavior}} + CHECK(x, EnumInt) // expected-warning {{Undefined behavior}} + CHECK(x, decltype(E_Dummy)) // expected-warning {{Undefined behavior}} +} + +void ClassEnum_test(ClassEnum x) { + CHECK(x, std::byte) // no-warning + CHECK(x, std::OtherByte) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnum) // no-warning + CHECK(x, ClassEnumChar) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumUChar) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumInt) // expected-warning {{Undefined behavior}} + CHECK(x, Enum) // expected-warning {{Undefined behavior}} + CHECK(x, EnumChar) // expected-warning {{Undefined behavior}} + CHECK(x, EnumUChar) // expected-warning {{Undefined behavior}} + CHECK(x, EnumInt) // expected-warning {{Undefined behavior}} + CHECK(x, decltype(E_Dummy)) // expected-warning {{Undefined behavior}} +} + +void ClassEnumChar_test(ClassEnumChar x) { + CHECK(x, std::byte) // no-warning + CHECK(x, std::OtherByte) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnum) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumChar) // no-warning + CHECK(x, ClassEnumUChar) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumInt) // expected-warning {{Undefined behavior}} + CHECK(x, Enum) // expected-warning {{Undefined behavior}} + CHECK(x, EnumChar) // expected-warning {{Undefined behavior}} + CHECK(x, EnumUChar) // expected-warning {{Undefined behavior}} + CHECK(x, EnumInt) // expected-warning {{Undefined behavior}} + CHECK(x, decltype(E_Dummy)) // expected-warning {{Undefined behavior}} +} + +void ClassEnumUChar_test(ClassEnumUChar x) { + CHECK(x, std::byte) // no-warning + CHECK(x, std::OtherByte) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnum) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumChar) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumUChar) // no-warning + CHECK(x, ClassEnumInt) // expected-warning {{Undefined behavior}} + CHECK(x, Enum) // expected-warning {{Undefined behavior}} + CHECK(x, EnumChar) // expected-warning {{Undefined behavior}} + CHECK(x, EnumUChar) // expected-warning {{Undefined behavior}} + CHECK(x, EnumInt) // expected-warning {{Undefined behavior}} + CHECK(x, decltype(E_Dummy)) // expected-warning {{Undefined behavior}} +} + +void ClassEnumInt_test(ClassEnumInt x) { + CHECK(x, std::byte) // no-warning + CHECK(x, std::OtherByte) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnum) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumChar) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumUChar) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumInt) // no-warning + CHECK(x, Enum) // expected-warning {{Undefined behavior}} + CHECK(x, EnumChar) // expected-warning {{Undefined behavior}} + CHECK(x, EnumUChar) // expected-warning {{Undefined behavior}} + CHECK(x, EnumInt) // expected-warning {{Undefined behavior}} + CHECK(x, decltype(E_Dummy)) // expected-warning {{Undefined behavior}} +} + +void Enum_test(Enum x) { + CHECK(x, std::byte) // no-warning + CHECK(x, std::OtherByte) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnum) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumChar) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumUChar) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumInt) // expected-warning {{Undefined behavior}} + CHECK(x, Enum) // no-warning + CHECK(x, EnumChar) // expected-warning {{Undefined behavior}} + CHECK(x, EnumUChar) // expected-warning {{Undefined behavior}} + CHECK(x, EnumInt) // expected-warning {{Undefined behavior}} + CHECK(x, decltype(E_Dummy)) // expected-warning {{Undefined behavior}} +} + +void EnumChar_test(EnumChar x) { + CHECK(x, std::byte) // no-warning + CHECK(x, std::OtherByte) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnum) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumChar) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumUChar) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumInt) // expected-warning {{Undefined behavior}} + CHECK(x, Enum) // expected-warning {{Undefined behavior}} + CHECK(x, EnumChar) // no-warning + CHECK(x, EnumUChar) // expected-warning {{Undefined behavior}} + CHECK(x, EnumInt) // expected-warning {{Undefined behavior}} + CHECK(x, decltype(E_Dummy)) // expected-warning {{Undefined behavior}} +} + +void EnumUChar_test(EnumUChar x) { + CHECK(x, std::byte) // no-warning + CHECK(x, std::OtherByte) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnum) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumChar) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumUChar) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumInt) // expected-warning {{Undefined behavior}} + CHECK(x, Enum) // expected-warning {{Undefined behavior}} + CHECK(x, EnumChar) // expected-warning {{Undefined behavior}} + CHECK(x, EnumUChar) // no-warning + CHECK(x, EnumInt) // expected-warning {{Undefined behavior}} + CHECK(x, decltype(E_Dummy)) // expected-warning {{Undefined behavior}} +} + +void EnumInt_test(EnumInt x) { + CHECK(x, std::byte) // no-warning + CHECK(x, std::OtherByte) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnum) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumChar) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumUChar) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumInt) // expected-warning {{Undefined behavior}} + CHECK(x, Enum) // expected-warning {{Undefined behavior}} + CHECK(x, EnumChar) // expected-warning {{Undefined behavior}} + CHECK(x, EnumUChar) // expected-warning {{Undefined behavior}} + CHECK(x, EnumInt) // no-warning + CHECK(x, decltype(E_Dummy)) // expected-warning {{Undefined behavior}} +} + +void E_Dummy_test(decltype(E_Dummy) x) { + CHECK(x, std::byte) // no-warning + CHECK(x, std::OtherByte) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnum) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumChar) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumUChar) // expected-warning {{Undefined behavior}} + CHECK(x, ClassEnumInt) // expected-warning {{Undefined behavior}} + CHECK(x, Enum) // expected-warning {{Undefined behavior}} + CHECK(x, EnumChar) // expected-warning {{Undefined behavior}} + CHECK(x, EnumUChar) // expected-warning {{Undefined behavior}} + CHECK(x, EnumInt) // expected-warning {{Undefined behavior}} + CHECK(x, decltype(E_Dummy)) // no-warning +} Index: clang/test/Analysis/Checkers/StrictAliasingChecker/enums.h =================================================================== --- /dev/null +++ clang/test/Analysis/Checkers/StrictAliasingChecker/enums.h @@ -0,0 +1,14 @@ +#pragma once +namespace std { +enum class byte : unsigned char {}; +enum class OtherByte : unsigned char {}; +}; // namespace std +enum class ClassEnum {}; +enum class ClassEnumChar : char {}; +enum class ClassEnumUChar : unsigned char {}; +enum class ClassEnumInt : int {}; +enum Enum {}; +enum EnumChar : char {}; +enum EnumUChar : unsigned char {}; +enum EnumInt : int {}; +enum { E_Dummy }; Index: clang/test/Analysis/Checkers/StrictAliasingChecker/scalar-ptr-to-enum.cpp =================================================================== --- /dev/null +++ clang/test/Analysis/Checkers/StrictAliasingChecker/scalar-ptr-to-enum.cpp @@ -0,0 +1,182 @@ +// RUN: %clang_cc1 -std=c++20 -analyze -analyzer-config eagerly-assume=false -analyzer-checker=debug.ExprInspection,alpha.core.StrictAliasing -verify %s +// NOTE: -relaxed-aliasing flag disables StrictAliasing checker. + +#include "enums.h" + +template +T *create(); + +#define CHECK(var, type) \ + { auto y = *(type *)var; } + +#define CHECKS \ + CHECK(x, std::OtherByte) \ + CHECK(x, ClassEnum) \ + CHECK(x, ClassEnumChar) \ + CHECK(x, ClassEnumUChar) \ + CHECK(x, ClassEnumInt) \ + CHECK(x, Enum) \ + CHECK(x, EnumChar) \ + CHECK(x, EnumUChar) \ + CHECK(x, EnumInt) \ + CHECK(x, decltype(E_Dummy)) + +void bool_test() { + auto *x = create(); + CHECK(x, std::byte) // no-warning + CHECKS // expected-warning 10{{Undefined behavior}} +} + +void char_test() { + auto *x = create(); + CHECK(x, std::byte) // no-warning + CHECKS // expected-warning 10{{Undefined behavior}} +} + +void short_test() { + auto *x = create(); + CHECK(x, std::byte) // no-warning + CHECKS // expected-warning 10{{Undefined behavior}} +} + +void int_test() { + auto *x = create(); + CHECK(x, std::byte) // no-warning + CHECKS // expected-warning 10{{Undefined behavior}} +} + +void long_test() { + auto *x = create(); + CHECK(x, std::byte) // no-warning + CHECKS // expected-warning 10{{Undefined behavior}} +} + +void long_long_test() { + auto *x = create(); + CHECK(x, std::byte) // no-warning + CHECKS // expected-warning 10{{Undefined behavior}} +} + +void schar_test() { + auto *x = create(); + CHECK(x, std::byte) // no-warning + CHECKS // expected-warning 10{{Undefined behavior}} +} + +void uchar_test() { + auto *x = create(); + CHECK(x, std::byte) // no-warning + CHECKS // expected-warning 10{{Undefined behavior}} +} + +void ushort_test() { + auto *x = create(); + CHECK(x, std::byte) // no-warning + CHECKS // expected-warning 10{{Undefined behavior}} +} + +void uint_test() { + auto *x = create(); + CHECK(x, std::byte) // no-warning + CHECKS // expected-warning 10{{Undefined behavior}} +} + +void ulong_test() { + auto *x = create(); + CHECK(x, std::byte) // no-warning + CHECKS // expected-warning 10{{Undefined behavior}} +} + +void ulong_long_test() { + auto *x = create(); + CHECK(x, std::byte) // no-warning + CHECKS // expected-warning 10{{Undefined behavior}} +} + +void float_test() { + auto *x = create(); + CHECK(x, std::byte) // no-warning + CHECKS // expected-warning 10{{Undefined behavior}} +} + +void double_test() { + auto *x = create(); + CHECK(x, std::byte) // no-warning + CHECKS // expected-warning 10{{Undefined behavior}} +} + +void long_double_test() { + auto *x = create(); + CHECK(x, std::byte) // no-warning + CHECKS // expected-warning 10{{Undefined behavior}} +} + +void bool_test(bool *x) { + CHECK(x, std::byte) // no-warning + CHECKS // expected-warning 10{{Undefined behavior}} +} + +void char_test(char *x) { + CHECK(x, std::byte) // no-warning + CHECKS // expected-warning 10{{Undefined behavior}} +} + +void short_test(short *x) { + CHECK(x, std::byte) // no-warning + CHECKS // expected-warning 10{{Undefined behavior}} +} + +void int_test(int *x) { + CHECK(x, std::byte) // no-warning + CHECKS // expected-warning 10{{Undefined behavior}} +} + +void long_test(long *x) { + CHECK(x, std::byte) // no-warning + CHECKS // expected-warning 10{{Undefined behavior}} +} + +void long_long_test(long long *x) { + CHECK(x, std::byte) // no-warning + CHECKS // expected-warning 10{{Undefined behavior}} +} + +void uchar_test(unsigned char *x) { + CHECK(x, std::byte) // no-warning + CHECKS // expected-warning 10{{Undefined behavior}} +} + +void ushort_test(unsigned short *x) { + CHECK(x, std::byte) // no-warning + CHECKS // expected-warning 10{{Undefined behavior}} +} + +void uint_test(unsigned int *x) { + CHECK(x, std::byte) // no-warning + CHECKS // expected-warning 10{{Undefined behavior}} +} + +void ulong_test(unsigned long *x) { + CHECK(x, std::byte) // no-warning + CHECKS // expected-warning 10{{Undefined behavior}} +} + +void ulong_long_test(unsigned long long *x) { + CHECK(x, std::byte) // no-warning + CHECKS // expected-warning 10{{Undefined behavior}} +} + +void float_test(float *x) { + CHECK(x, std::byte) // no-warning + CHECKS // expected-warning 10{{Undefined behavior}} +} + +void double_test(double *x) { + CHECK(x, std::byte) // no-warning + CHECKS // expected-warning 10{{Undefined behavior}} +} + +void long_double_test(long double *x) { + CHECK(x, std::byte) // no-warning + CHECKS // expected-warning 10{{Undefined behavior}} +} Index: clang/test/Analysis/Checkers/StrictAliasingChecker/scalar-var-to-enum.cpp =================================================================== --- /dev/null +++ clang/test/Analysis/Checkers/StrictAliasingChecker/scalar-var-to-enum.cpp @@ -0,0 +1,179 @@ +// RUN: %clang_cc1 -std=c++20 -analyze -analyzer-config eagerly-assume=false -analyzer-checker=debug.ExprInspection,alpha.core.StrictAliasing -verify %s +// NOTE: -relaxed-aliasing flag disables StrictAliasing checker. + +#include "enums.h" + +#define CHECK(var, type) \ + { auto y = *(type *)&var; } + +#define CHECKS \ + CHECK(x, std::OtherByte) \ + CHECK(x, ClassEnum) \ + CHECK(x, ClassEnumChar) \ + CHECK(x, ClassEnumUChar) \ + CHECK(x, ClassEnumInt) \ + CHECK(x, Enum) \ + CHECK(x, EnumChar) \ + CHECK(x, EnumUChar) \ + CHECK(x, EnumInt) \ + CHECK(x, decltype(E_Dummy)) + +void bool_test() { + bool x = 42; + CHECK(x, std::byte) // no-warning + CHECKS // expected-warning 10{{Undefined behavior}} +} + +void char_test() { + char x = 42; + CHECK(x, std::byte) // no-warning + CHECKS // expected-warning 10{{Undefined behavior}} +} + +void short_test() { + short x = 42; + CHECK(x, std::byte) // no-warning + CHECKS // expected-warning 10{{Undefined behavior}} +} + +void int_test() { + int x = 42; + CHECK(x, std::byte) // no-warning + CHECKS // expected-warning 10{{Undefined behavior}} +} + +void long_test() { + long x = 42; + CHECK(x, std::byte) // no-warning + CHECKS // expected-warning 10{{Undefined behavior}} +} + +void long_long_test() { + long long x = 42; + CHECK(x, std::byte) // no-warning + CHECKS // expected-warning 10{{Undefined behavior}} +} + +void schar_test() { + signed char x = 42; + CHECK(x, std::byte) // no-warning + CHECKS // expected-warning 10{{Undefined behavior}} +} + +void uchar_test() { + unsigned char x = 42; + CHECK(x, std::byte) // no-warning + CHECKS // expected-warning 10{{Undefined behavior}} +} + +void ushort_test() { + unsigned short x = 42; + CHECK(x, std::byte) // no-warning + CHECKS // expected-warning 10{{Undefined behavior}} +} + +void uint_test() { + unsigned int x = 42; + CHECK(x, std::byte) // no-warning + CHECKS // expected-warning 10{{Undefined behavior}} +} + +void ulong_test() { + unsigned long x = 42; + CHECK(x, std::byte) // no-warning + CHECKS // expected-warning 10{{Undefined behavior}} +} + +void ulong_long_test() { + unsigned long long x = 42; + CHECK(x, std::byte) // no-warning + CHECKS // expected-warning 10{{Undefined behavior}} +} + +void float_test() { + float x = 42; + CHECK(x, std::byte) // no-warning + CHECKS // expected-warning 10{{Undefined behavior}} +} + +void double_test() { + double x = 42; + CHECK(x, std::byte) // no-warning + CHECKS // expected-warning 10{{Undefined behavior}} +} + +void long_double_test() { + long double x = 42; + CHECK(x, std::byte) // no-warning + CHECKS // expected-warning 10{{Undefined behavior}} +} + +void bool_test(bool x) { + CHECK(x, std::byte) // no-warning + CHECKS // expected-warning 10{{Undefined behavior}} +} + +void char_test(char x) { + CHECK(x, std::byte) // no-warning + CHECKS // expected-warning 10{{Undefined behavior}} +} + +void short_test(short x) { + CHECK(x, std::byte) // no-warning + CHECKS // expected-warning 10{{Undefined behavior}} +} + +void int_test(int x) { + CHECK(x, std::byte) // no-warning + CHECKS // expected-warning 10{{Undefined behavior}} +} + +void long_test(long x) { + CHECK(x, std::byte) // no-warning + CHECKS // expected-warning 10{{Undefined behavior}} +} + +void long_long_test(long long x) { + CHECK(x, std::byte) // no-warning + CHECKS // expected-warning 10{{Undefined behavior}} +} + +void uchar_test(unsigned char x) { + CHECK(x, std::byte) // no-warning + CHECKS // expected-warning 10{{Undefined behavior}} +} + +void ushort_test(unsigned short x) { + CHECK(x, std::byte) // no-warning + CHECKS // expected-warning 10{{Undefined behavior}} +} + +void uint_test(unsigned int x) { + CHECK(x, std::byte) // no-warning + CHECKS // expected-warning 10{{Undefined behavior}} +} + +void ulong_test(unsigned long x) { + CHECK(x, std::byte) // no-warning + CHECKS // expected-warning 10{{Undefined behavior}} +} + +void ulong_long_test(unsigned long long x) { + CHECK(x, std::byte) // no-warning + CHECKS // expected-warning 10{{Undefined behavior}} +} + +void float_test(float x) { + CHECK(x, std::byte) // no-warning + CHECKS // expected-warning 10{{Undefined behavior}} +} + +void double_test(double x) { + CHECK(x, std::byte) // no-warning + CHECKS // expected-warning 10{{Undefined behavior}} +} + +void long_double_test(long double x) { + CHECK(x, std::byte) // no-warning + CHECKS // expected-warning 10{{Undefined behavior}} +}