forked from OSchip/llvm-project
Fix 2 cases of uninitialized reads of an invalid PresumedLoc.
The code in CGExpr was added back in 2012 (r165536) but not exercised in tests until recently. Detected on the MemorySanitizer bootstrap bot. llvm-svn: 190521
This commit is contained in:
parent
2b3f143f23
commit
a98799fe4b
|
@ -2095,8 +2095,8 @@ llvm::Constant *CodeGenFunction::EmitCheckSourceLocation(SourceLocation Loc) {
|
|||
PLoc.isValid() ? cast<llvm::Constant>(
|
||||
Builder.CreateGlobalStringPtr(PLoc.getFilename()))
|
||||
: llvm::Constant::getNullValue(Int8PtrTy),
|
||||
Builder.getInt32(PLoc.getLine()),
|
||||
Builder.getInt32(PLoc.getColumn())
|
||||
Builder.getInt32(PLoc.isValid() ? PLoc.getLine() : 0),
|
||||
Builder.getInt32(PLoc.isValid() ? PLoc.getColumn() : 0)
|
||||
};
|
||||
|
||||
return llvm::ConstantStruct::getAnon(Data);
|
||||
|
|
|
@ -266,7 +266,7 @@ void clang_getPresumedLocation(CXSourceLocation location,
|
|||
CXString *filename,
|
||||
unsigned *line,
|
||||
unsigned *column) {
|
||||
|
||||
|
||||
if (!isASTUnitSourceLocation(location)) {
|
||||
// Other SourceLocation implementations do not support presumed locations
|
||||
// at this time.
|
||||
|
@ -276,20 +276,22 @@ void clang_getPresumedLocation(CXSourceLocation location,
|
|||
|
||||
SourceLocation Loc = SourceLocation::getFromRawEncoding(location.int_data);
|
||||
|
||||
if (!location.ptr_data[0] || Loc.isInvalid())
|
||||
if (!location.ptr_data[0] || Loc.isInvalid()) {
|
||||
createNullLocation(filename, line, column);
|
||||
else {
|
||||
const SourceManager &SM =
|
||||
*static_cast<const SourceManager*>(location.ptr_data[0]);
|
||||
PresumedLoc PreLoc = SM.getPresumedLoc(Loc);
|
||||
|
||||
if (filename)
|
||||
*filename = cxstring::createRef(PreLoc.getFilename());
|
||||
if (line)
|
||||
*line = PreLoc.getLine();
|
||||
if (column)
|
||||
*column = PreLoc.getColumn();
|
||||
return;
|
||||
}
|
||||
|
||||
const SourceManager &SM =
|
||||
*static_cast<const SourceManager *>(location.ptr_data[0]);
|
||||
PresumedLoc PreLoc = SM.getPresumedLoc(Loc);
|
||||
if (PreLoc.isInvalid()) {
|
||||
createNullLocation(filename, line, column);
|
||||
return;
|
||||
}
|
||||
|
||||
if (filename) *filename = cxstring::createRef(PreLoc.getFilename());
|
||||
if (line) *line = PreLoc.getLine();
|
||||
if (column) *column = PreLoc.getColumn();
|
||||
}
|
||||
|
||||
void clang_getInstantiationLocation(CXSourceLocation location,
|
||||
|
|
Loading…
Reference in New Issue