Skip to content

Commit 83d1a68

Browse files
committed
Fix #10431 FP one-definition-rule if struct in mutually exclusive #ifdef branches
1 parent f28aeae commit 83d1a68

12 files changed

Lines changed: 23 additions & 14 deletions

lib/check.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ class CPPCHECKLIB Check {
110110
std::string file0;
111111
};
112112

113-
virtual FileInfo * getFileInfo(const Tokenizer& /*tokenizer*/, const Settings& /*settings*/) const {
113+
virtual FileInfo * getFileInfo(const Tokenizer& /*tokenizer*/, const Settings& /*settings*/, const std::string& /*currentConfig*/) const {
114114
return nullptr;
115115
}
116116

lib/checkbufferoverrun.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -947,7 +947,7 @@ bool CheckBufferOverrun::isCtuUnsafePointerArith(const Settings &settings, const
947947
}
948948

949949
/** @brief Parse current TU and extract file info */
950-
Check::FileInfo *CheckBufferOverrun::getFileInfo(const Tokenizer &tokenizer, const Settings &settings) const
950+
Check::FileInfo *CheckBufferOverrun::getFileInfo(const Tokenizer &tokenizer, const Settings &settings, const std::string& /*currentConfig*/) const
951951
{
952952
const std::list<CTU::FileInfo::UnsafeUsage> &unsafeArrayIndex = CTU::getUnsafeUsage(tokenizer, settings, isCtuUnsafeArrayIndex);
953953
const std::list<CTU::FileInfo::UnsafeUsage> &unsafePointerArith = CTU::getUnsafeUsage(tokenizer, settings, isCtuUnsafePointerArith);

lib/checkbufferoverrun.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ class CPPCHECKLIB CheckBufferOverrun : public Check {
7272
void getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const override;
7373

7474
/** @brief Parse current TU and extract file info */
75-
Check::FileInfo *getFileInfo(const Tokenizer &tokenizer, const Settings &settings) const override;
75+
Check::FileInfo *getFileInfo(const Tokenizer &tokenizer, const Settings &settings, const std::string& /*currentConfig*/) const override;
7676

7777
/** @brief Analyse all file infos for all TU */
7878
bool analyseWholeProgram(const CTU::FileInfo &ctu, const std::list<Check::FileInfo*> &fileInfo, const Settings& settings, ErrorLogger &errorLogger) override;

lib/checkclass.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3563,6 +3563,7 @@ namespace
35633563
struct NameLoc {
35643564
std::string className;
35653565
std::string fileName;
3566+
std::string configuration;
35663567
int lineNumber;
35673568
int column;
35683569
std::size_t hash;
@@ -3592,7 +3593,7 @@ namespace
35923593
};
35933594
}
35943595

3595-
Check::FileInfo *CheckClass::getFileInfo(const Tokenizer &tokenizer, const Settings& /*settings*/) const
3596+
Check::FileInfo *CheckClass::getFileInfo(const Tokenizer &tokenizer, const Settings& /*settings*/, const std::string& currentConfig) const
35963597
{
35973598
if (!tokenizer.isCPP())
35983599
return nullptr;
@@ -3649,6 +3650,7 @@ Check::FileInfo *CheckClass::getFileInfo(const Tokenizer &tokenizer, const Setti
36493650
}
36503651
}
36513652
nameLoc.hash = std::hash<std::string> {}(def);
3653+
nameLoc.configuration = currentConfig;
36523654

36533655
classDefinitions.push_back(std::move(nameLoc));
36543656
}
@@ -3716,6 +3718,8 @@ bool CheckClass::analyseWholeProgram(const CTU::FileInfo &ctu, const std::list<C
37163718
continue;
37173719
}
37183720
if (it->second.hash == nameLoc.hash)
3721+
continue;
3722+
if (it->second.configuration != nameLoc.configuration)
37193723
continue;
37203724
// Same location, sometimes the hash is different wrongly (possibly because of different token simplifications).
37213725
if (it->second.isSameLocation(nameLoc))

lib/checkclass.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ class CPPCHECKLIB CheckClass : public Check {
138138
void checkUnsafeClassRefMember();
139139

140140
/** @brief Parse current TU and extract file info */
141-
Check::FileInfo *getFileInfo(const Tokenizer &tokenizer, const Settings &settings) const override;
141+
Check::FileInfo *getFileInfo(const Tokenizer &tokenizer, const Settings &settings, const std::string& currentConfig) const override;
142142

143143
Check::FileInfo * loadFileInfoFromXml(const tinyxml2::XMLElement *xmlElement) const override;
144144

lib/checknullpointer.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -620,7 +620,7 @@ namespace
620620
};
621621
}
622622

623-
Check::FileInfo *CheckNullPointer::getFileInfo(const Tokenizer &tokenizer, const Settings &settings) const
623+
Check::FileInfo *CheckNullPointer::getFileInfo(const Tokenizer &tokenizer, const Settings &settings, const std::string& /*currentConfig*/) const
624624
{
625625
const std::list<CTU::FileInfo::UnsafeUsage> &unsafeUsage = CTU::getUnsafeUsage(tokenizer, settings, isUnsafeUsage);
626626
if (unsafeUsage.empty())

lib/checknullpointer.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ class CPPCHECKLIB CheckNullPointer : public Check {
9393
void nullPointerError(const Token *tok, const std::string &varname, const ValueFlow::Value* value, bool inconclusive);
9494

9595
/** @brief Parse current TU and extract file info */
96-
Check::FileInfo *getFileInfo(const Tokenizer &tokenizer, const Settings &settings) const override;
96+
Check::FileInfo *getFileInfo(const Tokenizer &tokenizer, const Settings &settings, const std::string& /*currentConfig*/) const override;
9797

9898
Check::FileInfo * loadFileInfoFromXml(const tinyxml2::XMLElement *xmlElement) const override;
9999

lib/checkuninitvar.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1730,7 +1730,7 @@ static bool isVariableUsage(const Settings &settings, const Token *argtok, CTU::
17301730
return isVariableUsage(settings, argtok, &value->value);
17311731
}
17321732

1733-
Check::FileInfo *CheckUninitVar::getFileInfo(const Tokenizer &tokenizer, const Settings &settings) const
1733+
Check::FileInfo *CheckUninitVar::getFileInfo(const Tokenizer &tokenizer, const Settings &settings, const std::string& /*currentConfig*/) const
17341734
{
17351735
const std::list<CTU::FileInfo::UnsafeUsage> &unsafeUsage = CTU::getUnsafeUsage(tokenizer, settings, ::isVariableUsage);
17361736
if (unsafeUsage.empty())

lib/checkuninitvar.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ class CPPCHECKLIB CheckUninitVar : public Check {
9696
void valueFlowUninit();
9797

9898
/** @brief Parse current TU and extract file info */
99-
Check::FileInfo *getFileInfo(const Tokenizer &tokenizer, const Settings &settings) const override;
99+
Check::FileInfo *getFileInfo(const Tokenizer &tokenizer, const Settings &settings, const std::string& /*currentConfig*/) const override;
100100

101101
Check::FileInfo * loadFileInfoFromXml(const tinyxml2::XMLElement *xmlElement) const override;
102102

lib/cppcheck.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -727,7 +727,7 @@ unsigned int CppCheck::checkClang(const FileWithDetails &file, int fileIndex)
727727
mSettings,
728728
&s_timerResults);
729729
tokenizer.printDebugOutput(std::cout);
730-
checkNormalTokens(tokenizer, nullptr); // TODO: provide analyzer information
730+
checkNormalTokens(tokenizer, nullptr, ""); // TODO: provide analyzer information
731731

732732
// create dumpfile
733733
std::ofstream fdump;
@@ -1203,7 +1203,7 @@ unsigned int CppCheck::checkFile(const FileWithDetails& file, const std::string
12031203
}
12041204

12051205
// Check normal tokens
1206-
checkNormalTokens(tokenizer, analyzerInformation.get());
1206+
checkNormalTokens(tokenizer, analyzerInformation.get(), currentConfig);
12071207
} catch (const InternalError &e) {
12081208
ErrorMessage errmsg = ErrorMessage::fromInternalError(e, &tokenizer.list, file.spath());
12091209
mErrorLogger.reportErr(errmsg);
@@ -1327,7 +1327,7 @@ void CppCheck::internalError(const std::string &filename, const std::string &msg
13271327
// CppCheck - A function that checks a normal token list
13281328
//---------------------------------------------------------------------------
13291329

1330-
void CppCheck::checkNormalTokens(const Tokenizer &tokenizer, AnalyzerInformation* analyzerInformation)
1330+
void CppCheck::checkNormalTokens(const Tokenizer &tokenizer, AnalyzerInformation* analyzerInformation, const std::string& currentConfig)
13311331
{
13321332
CheckUnusedFunctions unusedFunctionsChecker;
13331333

@@ -1392,7 +1392,7 @@ void CppCheck::checkNormalTokens(const Tokenizer &tokenizer, AnalyzerInformation
13921392
if (!doUnusedFunctionOnly) {
13931393
// cppcheck-suppress shadowFunction - TODO: fix this
13941394
for (const Check *check : Check::instances()) {
1395-
if (Check::FileInfo * const fi = check->getFileInfo(tokenizer, mSettings)) {
1395+
if (Check::FileInfo * const fi = check->getFileInfo(tokenizer, mSettings, currentConfig)) {
13961396
if (analyzerInformation)
13971397
analyzerInformation->setFileInfo(check->name(), fi->toString());
13981398
if (mSettings.useSingleJob())

0 commit comments

Comments
 (0)