steakhal created this revision. steakhal added reviewers: NoQ, xazax.hun. Herald added subscribers: manas, ASDenysPetrov, martong, dkrupp, donat.nagy, Szelethus, mikhail.ramalho, a.sidorin, rnkovacs, szepet, baloghadamsoftware. Herald added a reviewer: Szelethus. Herald added a project: All. steakhal requested review of this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits.
According to my measurement in https://reviews.llvm.org/D108230#3933232, it seems like there is no drawback to enabling this analyzer-config by default. Actually, enabling this by default would make it consistent with the codegen of clang, which according to `-fstrict-flex-arrays`, assumes by default that all trailing arrays could be FAMs, let them be of size undefined, zero, one, or anything else. Speaking of `-fstrict-flex-arrays`, in the next patch I'll deprecate the analyzer-config FAM option in favor of that flag. That way, CSA will always be in sync with what the codegen will think of FAMs. So, if a new codebase sets `-fstrict-flex-arrays` to some value above 0, CSA will also make sure that only arrays of the right size will be considered as FAMs. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D138657 Files: clang/docs/ReleaseNotes.rst clang/include/clang/StaticAnalyzer/Core/AnalyzerOptions.def clang/test/Analysis/analyzer-config.c clang/test/Analysis/flexible-array-members.c Index: clang/test/Analysis/flexible-array-members.c =================================================================== --- clang/test/Analysis/flexible-array-members.c +++ clang/test/Analysis/flexible-array-members.c @@ -1,13 +1,22 @@ -// RUN: %clang_analyze_cc1 -triple x86_64-linux-gnu -analyzer-checker=core,unix,debug.ExprInspection %s -verify -std=c90 -// RUN: %clang_analyze_cc1 -triple x86_64-linux-gnu -analyzer-checker=core,unix,debug.ExprInspection %s -verify -std=c99 -// RUN: %clang_analyze_cc1 -triple x86_64-linux-gnu -analyzer-checker=core,unix,debug.ExprInspection %s -verify -std=c11 -// RUN: %clang_analyze_cc1 -triple x86_64-linux-gnu -analyzer-checker=core,unix,debug.ExprInspection %s -verify -std=c17 - -// RUN: %clang_analyze_cc1 -triple x86_64-linux-gnu -analyzer-checker=core,unix,debug.ExprInspection %s -verify -std=c++98 -x c++ -// RUN: %clang_analyze_cc1 -triple x86_64-linux-gnu -analyzer-checker=core,unix,debug.ExprInspection %s -verify -std=c++03 -x c++ -// RUN: %clang_analyze_cc1 -triple x86_64-linux-gnu -analyzer-checker=core,unix,debug.ExprInspection %s -verify -std=c++11 -x c++ -// RUN: %clang_analyze_cc1 -triple x86_64-linux-gnu -analyzer-checker=core,unix,debug.ExprInspection %s -verify -std=c++14 -x c++ -// RUN: %clang_analyze_cc1 -triple x86_64-linux-gnu -analyzer-checker=core,unix,debug.ExprInspection %s -verify -std=c++17 -x c++ +// RUN: %clang_analyze_cc1 -triple x86_64-linux-gnu -analyzer-checker=core,unix,debug.ExprInspection %s -verify -std=c90 \ +// RUN: -analyzer-config consider-single-element-arrays-as-flexible-array-members=false +// RUN: %clang_analyze_cc1 -triple x86_64-linux-gnu -analyzer-checker=core,unix,debug.ExprInspection %s -verify -std=c99 \ +// RUN: -analyzer-config consider-single-element-arrays-as-flexible-array-members=false +// RUN: %clang_analyze_cc1 -triple x86_64-linux-gnu -analyzer-checker=core,unix,debug.ExprInspection %s -verify -std=c11 \ +// RUN: -analyzer-config consider-single-element-arrays-as-flexible-array-members=false +// RUN: %clang_analyze_cc1 -triple x86_64-linux-gnu -analyzer-checker=core,unix,debug.ExprInspection %s -verify -std=c17 \ +// RUN: -analyzer-config consider-single-element-arrays-as-flexible-array-members=false + +// RUN: %clang_analyze_cc1 -triple x86_64-linux-gnu -analyzer-checker=core,unix,debug.ExprInspection %s -verify -std=c++98 -x c++ \ +// RUN: -analyzer-config consider-single-element-arrays-as-flexible-array-members=false +// RUN: %clang_analyze_cc1 -triple x86_64-linux-gnu -analyzer-checker=core,unix,debug.ExprInspection %s -verify -std=c++03 -x c++ \ +// RUN: -analyzer-config consider-single-element-arrays-as-flexible-array-members=false +// RUN: %clang_analyze_cc1 -triple x86_64-linux-gnu -analyzer-checker=core,unix,debug.ExprInspection %s -verify -std=c++11 -x c++ \ +// RUN: -analyzer-config consider-single-element-arrays-as-flexible-array-members=false +// RUN: %clang_analyze_cc1 -triple x86_64-linux-gnu -analyzer-checker=core,unix,debug.ExprInspection %s -verify -std=c++14 -x c++ \ +// RUN: -analyzer-config consider-single-element-arrays-as-flexible-array-members=false +// RUN: %clang_analyze_cc1 -triple x86_64-linux-gnu -analyzer-checker=core,unix,debug.ExprInspection %s -verify -std=c++17 -x c++ \ +// RUN: -analyzer-config consider-single-element-arrays-as-flexible-array-members=false // RUN: %clang_analyze_cc1 -triple x86_64-linux-gnu -analyzer-checker=core,unix,debug.ExprInspection %s -verify -std=c17 \ // RUN: -analyzer-config consider-single-element-arrays-as-flexible-array-members=true -DSINGLE_ELEMENT_FAMS Index: clang/test/Analysis/analyzer-config.c =================================================================== --- clang/test/Analysis/analyzer-config.c +++ clang/test/Analysis/analyzer-config.c @@ -33,7 +33,7 @@ // CHECK-NEXT: cfg-rich-constructors = true // CHECK-NEXT: cfg-scopes = false // CHECK-NEXT: cfg-temporary-dtors = true -// CHECK-NEXT: consider-single-element-arrays-as-flexible-array-members = false +// CHECK-NEXT: consider-single-element-arrays-as-flexible-array-members = true // CHECK-NEXT: core.CallAndMessage:ArgInitializedness = true // CHECK-NEXT: core.CallAndMessage:ArgPointeeInitializedness = false // CHECK-NEXT: core.CallAndMessage:CXXDeallocationArg = true Index: clang/include/clang/StaticAnalyzer/Core/AnalyzerOptions.def =================================================================== --- clang/include/clang/StaticAnalyzer/Core/AnalyzerOptions.def +++ clang/include/clang/StaticAnalyzer/Core/AnalyzerOptions.def @@ -332,7 +332,7 @@ "Consider single element arrays as flexible array member candidates. " "This will prevent the analyzer from assuming that a single element array " "holds a single element.", - false) + true) ANALYZER_OPTION( bool, ShouldAssumeControlledEnvironment, "assume-controlled-environment", Index: clang/docs/ReleaseNotes.rst =================================================================== --- clang/docs/ReleaseNotes.rst +++ clang/docs/ReleaseNotes.rst @@ -827,6 +827,10 @@ ``scanbuild`` was also updated accordingly. Passing these flags will result in a hard error. +- Trailing array objects of structs with single elements will be considered + as flexible-array-members. Use ``-fstrict-flex-array=<N>`` to define + what should be considered as flexible-array-member if needed. + .. _release-notes-sanitizers: Sanitizers
Index: clang/test/Analysis/flexible-array-members.c =================================================================== --- clang/test/Analysis/flexible-array-members.c +++ clang/test/Analysis/flexible-array-members.c @@ -1,13 +1,22 @@ -// RUN: %clang_analyze_cc1 -triple x86_64-linux-gnu -analyzer-checker=core,unix,debug.ExprInspection %s -verify -std=c90 -// RUN: %clang_analyze_cc1 -triple x86_64-linux-gnu -analyzer-checker=core,unix,debug.ExprInspection %s -verify -std=c99 -// RUN: %clang_analyze_cc1 -triple x86_64-linux-gnu -analyzer-checker=core,unix,debug.ExprInspection %s -verify -std=c11 -// RUN: %clang_analyze_cc1 -triple x86_64-linux-gnu -analyzer-checker=core,unix,debug.ExprInspection %s -verify -std=c17 - -// RUN: %clang_analyze_cc1 -triple x86_64-linux-gnu -analyzer-checker=core,unix,debug.ExprInspection %s -verify -std=c++98 -x c++ -// RUN: %clang_analyze_cc1 -triple x86_64-linux-gnu -analyzer-checker=core,unix,debug.ExprInspection %s -verify -std=c++03 -x c++ -// RUN: %clang_analyze_cc1 -triple x86_64-linux-gnu -analyzer-checker=core,unix,debug.ExprInspection %s -verify -std=c++11 -x c++ -// RUN: %clang_analyze_cc1 -triple x86_64-linux-gnu -analyzer-checker=core,unix,debug.ExprInspection %s -verify -std=c++14 -x c++ -// RUN: %clang_analyze_cc1 -triple x86_64-linux-gnu -analyzer-checker=core,unix,debug.ExprInspection %s -verify -std=c++17 -x c++ +// RUN: %clang_analyze_cc1 -triple x86_64-linux-gnu -analyzer-checker=core,unix,debug.ExprInspection %s -verify -std=c90 \ +// RUN: -analyzer-config consider-single-element-arrays-as-flexible-array-members=false +// RUN: %clang_analyze_cc1 -triple x86_64-linux-gnu -analyzer-checker=core,unix,debug.ExprInspection %s -verify -std=c99 \ +// RUN: -analyzer-config consider-single-element-arrays-as-flexible-array-members=false +// RUN: %clang_analyze_cc1 -triple x86_64-linux-gnu -analyzer-checker=core,unix,debug.ExprInspection %s -verify -std=c11 \ +// RUN: -analyzer-config consider-single-element-arrays-as-flexible-array-members=false +// RUN: %clang_analyze_cc1 -triple x86_64-linux-gnu -analyzer-checker=core,unix,debug.ExprInspection %s -verify -std=c17 \ +// RUN: -analyzer-config consider-single-element-arrays-as-flexible-array-members=false + +// RUN: %clang_analyze_cc1 -triple x86_64-linux-gnu -analyzer-checker=core,unix,debug.ExprInspection %s -verify -std=c++98 -x c++ \ +// RUN: -analyzer-config consider-single-element-arrays-as-flexible-array-members=false +// RUN: %clang_analyze_cc1 -triple x86_64-linux-gnu -analyzer-checker=core,unix,debug.ExprInspection %s -verify -std=c++03 -x c++ \ +// RUN: -analyzer-config consider-single-element-arrays-as-flexible-array-members=false +// RUN: %clang_analyze_cc1 -triple x86_64-linux-gnu -analyzer-checker=core,unix,debug.ExprInspection %s -verify -std=c++11 -x c++ \ +// RUN: -analyzer-config consider-single-element-arrays-as-flexible-array-members=false +// RUN: %clang_analyze_cc1 -triple x86_64-linux-gnu -analyzer-checker=core,unix,debug.ExprInspection %s -verify -std=c++14 -x c++ \ +// RUN: -analyzer-config consider-single-element-arrays-as-flexible-array-members=false +// RUN: %clang_analyze_cc1 -triple x86_64-linux-gnu -analyzer-checker=core,unix,debug.ExprInspection %s -verify -std=c++17 -x c++ \ +// RUN: -analyzer-config consider-single-element-arrays-as-flexible-array-members=false // RUN: %clang_analyze_cc1 -triple x86_64-linux-gnu -analyzer-checker=core,unix,debug.ExprInspection %s -verify -std=c17 \ // RUN: -analyzer-config consider-single-element-arrays-as-flexible-array-members=true -DSINGLE_ELEMENT_FAMS Index: clang/test/Analysis/analyzer-config.c =================================================================== --- clang/test/Analysis/analyzer-config.c +++ clang/test/Analysis/analyzer-config.c @@ -33,7 +33,7 @@ // CHECK-NEXT: cfg-rich-constructors = true // CHECK-NEXT: cfg-scopes = false // CHECK-NEXT: cfg-temporary-dtors = true -// CHECK-NEXT: consider-single-element-arrays-as-flexible-array-members = false +// CHECK-NEXT: consider-single-element-arrays-as-flexible-array-members = true // CHECK-NEXT: core.CallAndMessage:ArgInitializedness = true // CHECK-NEXT: core.CallAndMessage:ArgPointeeInitializedness = false // CHECK-NEXT: core.CallAndMessage:CXXDeallocationArg = true Index: clang/include/clang/StaticAnalyzer/Core/AnalyzerOptions.def =================================================================== --- clang/include/clang/StaticAnalyzer/Core/AnalyzerOptions.def +++ clang/include/clang/StaticAnalyzer/Core/AnalyzerOptions.def @@ -332,7 +332,7 @@ "Consider single element arrays as flexible array member candidates. " "This will prevent the analyzer from assuming that a single element array " "holds a single element.", - false) + true) ANALYZER_OPTION( bool, ShouldAssumeControlledEnvironment, "assume-controlled-environment", Index: clang/docs/ReleaseNotes.rst =================================================================== --- clang/docs/ReleaseNotes.rst +++ clang/docs/ReleaseNotes.rst @@ -827,6 +827,10 @@ ``scanbuild`` was also updated accordingly. Passing these flags will result in a hard error. +- Trailing array objects of structs with single elements will be considered + as flexible-array-members. Use ``-fstrict-flex-array=<N>`` to define + what should be considered as flexible-array-member if needed. + .. _release-notes-sanitizers: Sanitizers
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits