Loading clang/lib/StaticAnalyzer/Checkers/StdLibraryFunctionsChecker.cpp +6 −2 Original line number Diff line number Diff line Loading @@ -2992,12 +2992,16 @@ void StdLibraryFunctionsChecker::initFunctionSummaries( // char *realpath(const char *restrict file_name, // char *restrict resolved_name); // FIXME: Improve for errno modeling. // FIXME: If the argument 'resolved_name' is not NULL, macro 'PATH_MAX' // should be defined in "limits.h" to guarrantee a success. addToFunctionSummaryMap( "realpath", Signature(ArgTypes{ConstCharPtrRestrictTy, CharPtrRestrictTy}, RetType{CharPtrTy}), Summary(NoEvalCall).ArgConstraint(NotNull(ArgNo(0)))); Summary(NoEvalCall) .Case({NotNull(Ret)}, ErrnoMustNotBeChecked, GenericSuccessMsg) .Case({IsNull(Ret)}, ErrnoNEZeroIrrelevant, GenericFailureMsg) .ArgConstraint(NotNull(ArgNo(0)))); QualType CharPtrConstPtr = getPointerTy(getConstTy(CharPtrTy)); Loading clang/test/Analysis/errno-stdlibraryfunctions.c +10 −0 Original line number Diff line number Diff line Loading @@ -128,3 +128,13 @@ void errno_pclose(void) { if (errno) {} // expected-warning{{An undefined value may be read from 'errno'}} } } void errno_realpath(char *Path, char *Buf) { char *Ret = realpath(Path, Buf); if (!Ret) { clang_analyzer_eval(errno != 0); // expected-warning{{TRUE}} if (errno) {} // no-warning } else { if (errno) {} // expected-warning{{An undefined value may be read from 'errno'}} } } Loading
clang/lib/StaticAnalyzer/Checkers/StdLibraryFunctionsChecker.cpp +6 −2 Original line number Diff line number Diff line Loading @@ -2992,12 +2992,16 @@ void StdLibraryFunctionsChecker::initFunctionSummaries( // char *realpath(const char *restrict file_name, // char *restrict resolved_name); // FIXME: Improve for errno modeling. // FIXME: If the argument 'resolved_name' is not NULL, macro 'PATH_MAX' // should be defined in "limits.h" to guarrantee a success. addToFunctionSummaryMap( "realpath", Signature(ArgTypes{ConstCharPtrRestrictTy, CharPtrRestrictTy}, RetType{CharPtrTy}), Summary(NoEvalCall).ArgConstraint(NotNull(ArgNo(0)))); Summary(NoEvalCall) .Case({NotNull(Ret)}, ErrnoMustNotBeChecked, GenericSuccessMsg) .Case({IsNull(Ret)}, ErrnoNEZeroIrrelevant, GenericFailureMsg) .ArgConstraint(NotNull(ArgNo(0)))); QualType CharPtrConstPtr = getPointerTy(getConstTy(CharPtrTy)); Loading
clang/test/Analysis/errno-stdlibraryfunctions.c +10 −0 Original line number Diff line number Diff line Loading @@ -128,3 +128,13 @@ void errno_pclose(void) { if (errno) {} // expected-warning{{An undefined value may be read from 'errno'}} } } void errno_realpath(char *Path, char *Buf) { char *Ret = realpath(Path, Buf); if (!Ret) { clang_analyzer_eval(errno != 0); // expected-warning{{TRUE}} if (errno) {} // no-warning } else { if (errno) {} // expected-warning{{An undefined value may be read from 'errno'}} } }