diff --git a/lib/ctu.cpp b/lib/ctu.cpp index 4af86a617..a5d34bb25 100644 --- a/lib/ctu.cpp +++ b/lib/ctu.cpp @@ -32,8 +32,9 @@ static const char ATTR_CALL_ARGEXPR[] = "call-argexpr"; static const char ATTR_CALL_ARGVALUETYPE[] = "call-argvaluetype"; static const char ATTR_CALL_ARGVALUE[] = "call-argvalue"; static const char ATTR_WARNING[] = "warning"; -static const char ATTR_LOC_FILENAME[] = "filename"; -static const char ATTR_LOC_LINENR[] = "linenr"; +static const char ATTR_LOC_FILENAME[] = "file"; +static const char ATTR_LOC_LINENR[] = "line"; +static const char ATTR_LOC_COLUMN[] = "col"; static const char ATTR_INFO[] = "info"; static const char ATTR_MY_ID[] = "my-id"; static const char ATTR_MY_ARGNR[] = "my-argnr"; @@ -49,7 +50,8 @@ std::string CTU::getFunctionId(const Tokenizer *tokenizer, const Function *funct CTU::FileInfo::Location::Location(const Tokenizer *tokenizer, const Token *tok) : fileName(tokenizer->list.file(tok)) - , linenr(tok->linenr()) + , lineNumber(tok->linenr()) + , column(tok->column()) { } @@ -77,7 +79,8 @@ std::string CTU::FileInfo::CallBase::toBaseXmlString() const << " " << ATTR_CALL_FUNCNAME << "=\"" << callFunctionName << "\"" << " " << ATTR_CALL_ARGNR << "=\"" << callArgNr << "\"" << " " << ATTR_LOC_FILENAME << "=\"" << location.fileName << "\"" - << " " << ATTR_LOC_LINENR << "=\"" << location.linenr << "\""; + << " " << ATTR_LOC_LINENR << "=\"" << location.lineNumber << "\"" + << " " << ATTR_LOC_COLUMN << "=\"" << location.column << "\""; return out.str(); } @@ -99,6 +102,7 @@ std::string CTU::FileInfo::FunctionCall::toXmlString() const out << " \n"; out << ""; } @@ -124,7 +128,8 @@ std::string CTU::FileInfo::UnsafeUsage::toString() const << " " << ATTR_MY_ARGNR << "=\"" << myArgNr << '\"' << " " << ATTR_MY_ARGNAME << "=\"" << myArgumentName << '\"' << " " << ATTR_LOC_FILENAME << "=\"" << location.fileName << '\"' - << " " << ATTR_LOC_LINENR << "=\"" << location.linenr << '\"' + << " " << ATTR_LOC_LINENR << "=\"" << location.lineNumber << '\"' + << " " << ATTR_LOC_COLUMN << "=\"" << location.column << '\"' << " " << ATTR_VALUE << "=\"" << value << "\"" << "/>\n"; return out.str(); @@ -176,7 +181,8 @@ bool CTU::FileInfo::CallBase::loadBaseFromXml(const tinyxml2::XMLElement *xmlEle callFunctionName = readAttrString(xmlElement, ATTR_CALL_FUNCNAME, &error); callArgNr = readAttrInt(xmlElement, ATTR_CALL_ARGNR, &error); location.fileName = readAttrString(xmlElement, ATTR_LOC_FILENAME, &error); - location.linenr = readAttrInt(xmlElement, ATTR_LOC_LINENR, &error); + location.lineNumber = readAttrInt(xmlElement, ATTR_LOC_LINENR, &error); + location.column = readAttrInt(xmlElement, ATTR_LOC_COLUMN, &error); return !error; } @@ -196,6 +202,7 @@ bool CTU::FileInfo::FunctionCall::loadFromXml(const tinyxml2::XMLElement *xmlEle ErrorLogger::ErrorMessage::FileLocation loc; loc.setfile(readAttrString(e2, ATTR_LOC_FILENAME, &error)); loc.line = readAttrInt(e2, ATTR_LOC_LINENR, &error); + loc.column = readAttrInt(e2, ATTR_LOC_COLUMN, &error); loc.setinfo(readAttrString(e2, ATTR_INFO, &error)); } return !error; @@ -248,7 +255,8 @@ std::list CTU::loadUnsafeUsageListFromXml(const tiny unsafeUsage.myArgNr = readAttrInt(e, ATTR_MY_ARGNR, &error); unsafeUsage.myArgumentName = readAttrString(e, ATTR_MY_ARGNAME, &error); unsafeUsage.location.fileName = readAttrString(e, ATTR_LOC_FILENAME, &error); - unsafeUsage.location.linenr = readAttrInt(e, ATTR_LOC_LINENR, &error); + unsafeUsage.location.lineNumber = readAttrInt(e, ATTR_LOC_LINENR, &error); + unsafeUsage.location.column = readAttrInt(e, ATTR_LOC_COLUMN, &error); unsafeUsage.value = readAttrInt(e, ATTR_VALUE, &error); if (!error) @@ -317,8 +325,7 @@ CTU::FileInfo *CTU::getFileInfo(const Tokenizer *tokenizer) functionCall.callValueType = value.valueType; functionCall.callId = getFunctionId(tokenizer, tok->astOperand1()->function()); functionCall.callFunctionName = tok->astOperand1()->expressionString(); - functionCall.location.fileName = tokenizer->list.file(tok); - functionCall.location.linenr = tok->linenr(); + functionCall.location = FileInfo::Location(tokenizer,tok); functionCall.callArgNr = argnr + 1; functionCall.callArgumentExpression = argtok->expressionString(); functionCall.callArgValue = value.intvalue; @@ -327,6 +334,7 @@ CTU::FileInfo *CTU::getFileInfo(const Tokenizer *tokenizer) ErrorLogger::ErrorMessage::FileLocation loc; loc.setfile(tokenizer->list.file(i.first)); loc.line = i.first->linenr(); + loc.column = i.first->column(); loc.setinfo(i.second); functionCall.callValuePath.push_back(loc); } @@ -338,8 +346,7 @@ CTU::FileInfo *CTU::getFileInfo(const Tokenizer *tokenizer) functionCall.callValueType = ValueFlow::Value::ValueType::BUFFER_SIZE; functionCall.callId = getFunctionId(tokenizer, tok->astOperand1()->function()); functionCall.callFunctionName = tok->astOperand1()->expressionString(); - functionCall.location.fileName = tokenizer->list.file(tok); - functionCall.location.linenr = tok->linenr(); + functionCall.location = FileInfo::Location(tokenizer, tok); functionCall.callArgNr = argnr + 1; functionCall.callArgumentExpression = argtok->expressionString(); functionCall.callArgValue = argtok->variable()->dimension(0) * argtok->valueType()->typeSize(*tokenizer->getSettings()); @@ -352,8 +359,7 @@ CTU::FileInfo *CTU::getFileInfo(const Tokenizer *tokenizer) functionCall.callValueType = ValueFlow::Value::ValueType::BUFFER_SIZE; functionCall.callId = getFunctionId(tokenizer, tok->astOperand1()->function()); functionCall.callFunctionName = tok->astOperand1()->expressionString(); - functionCall.location.fileName = tokenizer->list.file(tok); - functionCall.location.linenr = tok->linenr(); + functionCall.location = FileInfo::Location(tokenizer, tok); functionCall.callArgNr = argnr + 1; functionCall.callArgumentExpression = argtok->expressionString(); functionCall.callArgValue = argtok->astOperand1()->valueType()->typeSize(*tokenizer->getSettings()); @@ -374,8 +380,7 @@ CTU::FileInfo *CTU::getFileInfo(const Tokenizer *tokenizer) functionCall.callValueType = ValueFlow::Value::ValueType::UNINIT; functionCall.callId = getFunctionId(tokenizer, tok->astOperand1()->function()); functionCall.callFunctionName = tok->astOperand1()->expressionString(); - functionCall.location.fileName = tokenizer->list.file(tok); - functionCall.location.linenr = tok->linenr(); + functionCall.location = FileInfo::Location(tokenizer, tok); functionCall.callArgNr = argnr + 1; functionCall.callArgValue = 0; functionCall.callArgumentExpression = argtok->expressionString(); @@ -543,14 +548,16 @@ std::list CTU::FileInfo::getErrorPath(I ErrorLogger::ErrorMessage::FileLocation fileLoc; fileLoc.setfile(path[index]->location.fileName); - fileLoc.line = path[index]->location.linenr; + fileLoc.line = path[index]->location.lineNumber; + fileLoc.column = path[index]->location.column; fileLoc.setinfo("Calling function " + path[index]->callFunctionName + ", " + MathLib::toString(path[index]->callArgNr) + getOrdinalText(path[index]->callArgNr) + " argument is " + value1); locationList.push_back(fileLoc); } ErrorLogger::ErrorMessage::FileLocation fileLoc2; fileLoc2.setfile(unsafeUsage.location.fileName); - fileLoc2.line = unsafeUsage.location.linenr; + fileLoc2.line = unsafeUsage.location.lineNumber; + fileLoc2.column = unsafeUsage.location.column; fileLoc2.setinfo(replaceStr(info, "ARG", unsafeUsage.myArgumentName)); locationList.push_back(fileLoc2); diff --git a/lib/ctu.h b/lib/ctu.h index f743b6bee..63a5e1c77 100644 --- a/lib/ctu.h +++ b/lib/ctu.h @@ -40,9 +40,10 @@ namespace CTU { struct Location { Location() = default; Location(const Tokenizer *tokenizer, const Token *tok); - Location(const std::string &fileName, nonneg int linenr) : fileName(fileName), linenr(linenr) {} + Location(const std::string &fileName, nonneg int lineNumber, nonneg int column) : fileName(fileName), lineNumber(lineNumber), column(column) {} std::string fileName; - nonneg int linenr; + nonneg int lineNumber; + nonneg int column; }; struct UnsafeUsage {