@@ -610,3 +610,51 @@ void top() {
610610 consume (parseMatchComponent ());
611611}
612612} // namespace elementwise_copy_small_array_from_post_initializer_of_cctor
613+
614+ namespace gh147686 {
615+ // The problem reported in https://github.com/llvm/llvm-project/issues/147686
616+ // is sensitive to the initializer form: using parenthesis to initialize m_ptr
617+ // resulted in crashes when analyzing *m_ptr = '\0'; but using braces is fine.
618+
619+ struct A {
620+ A () : m_ptr(m_buf) { *m_ptr = ' \0 ' ; } // no-crash
621+ A (int overload) : m_ptr{m_buf} { *m_ptr = ' \0 ' ; }
622+ A (char src) : m_ptr(m_buf) { *m_ptr = src; } // no-crash
623+ A (char src, int overload) : m_ptr{m_buf} { *m_ptr = src; }
624+ char m_buf[64 ] = {0 };
625+ char * m_ptr;
626+ };
627+
628+ void test1 () {
629+ A a;
630+ clang_analyzer_eval (a.m_buf [0 ] == 0 ); // expected-warning{{TRUE}}
631+ // FIXME The next eval should result in TRUE.
632+ clang_analyzer_eval (*a.m_ptr == 0 ); // expected-warning{{UNKNOWN}}
633+ }
634+
635+ void test2 () {
636+ A a (314 );
637+ clang_analyzer_eval (a.m_buf [0 ] == 0 ); // expected-warning{{TRUE}}
638+ clang_analyzer_eval (*a.m_ptr == 0 ); // expected-warning{{TRUE}}
639+ }
640+
641+ void test3 () {
642+ A a (0 );
643+ clang_analyzer_eval (a.m_buf [0 ] == 0 ); // expected-warning{{TRUE}}
644+ clang_analyzer_eval (*a.m_ptr == 0 ); // expected-warning{{TRUE}}
645+ }
646+
647+ void test3Bis (char arg) {
648+ A a (arg);
649+ // FIXME This test should behave like test3.
650+ clang_analyzer_eval (a.m_buf [0 ] == arg); // expected-warning{{FALSE}} // expected-warning{{TRUE}}
651+ clang_analyzer_eval (*a.m_ptr == arg); // expected-warning{{UNKNOWN}}
652+ }
653+
654+ void test4 (char arg) {
655+ A a (arg, 314 );
656+ clang_analyzer_eval (a.m_buf [0 ] == arg); // expected-warning{{TRUE}}
657+ clang_analyzer_eval (*a.m_ptr == arg); // expected-warning{{TRUE}}
658+ }
659+
660+ } // namespace gh147686
0 commit comments