C++: IR translation for global variable inits

This commit is contained in:
Robert Marsh
2022-03-21 13:17:05 -04:00
parent 143b79c0cc
commit c27dfb5120
25 changed files with 329 additions and 41 deletions

View File

@@ -16,7 +16,7 @@ class IRConfiguration extends TIRConfiguration {
/**
* Holds if IR should be created for function `func`. By default, holds for all functions.
*/
predicate shouldCreateIRForFunction(Language::Function func) { any() }
predicate shouldCreateIRForFunction(Language::Declaration func) { any() }
/**
* Holds if the strings used as part of an IR dump should be generated for function `func`.
@@ -25,7 +25,7 @@ class IRConfiguration extends TIRConfiguration {
* of debug strings for IR that will not be dumped. We still generate the actual IR for these
* functions, however, to preserve the results of any interprocedural analysis.
*/
predicate shouldEvaluateDebugStringsForFunction(Language::Function func) { any() }
predicate shouldEvaluateDebugStringsForFunction(Language::Declaration func) { any() }
}
private newtype TIREscapeAnalysisConfiguration = MkIREscapeAnalysisConfiguration()

View File

@@ -97,7 +97,7 @@ class IRBlockBase extends TIRBlock {
/**
* Gets the `Function` that contains this block.
*/
final Language::Function getEnclosingFunction() {
final Language::Declaration getEnclosingFunction() {
result = getFirstInstruction(this).getEnclosingFunction()
}
}

View File

@@ -194,7 +194,7 @@ class Instruction extends Construction::TStageInstruction {
/**
* Gets the function that contains this instruction.
*/
final Language::Function getEnclosingFunction() {
final Language::Declaration getEnclosingFunction() {
result = this.getEnclosingIRFunction().getFunction()
}

View File

@@ -26,20 +26,20 @@ class PrintIRConfiguration extends TPrintIRConfiguration {
* Holds if the IR for `func` should be printed. By default, holds for all
* functions.
*/
predicate shouldPrintFunction(Language::Function func) { any() }
predicate shouldPrintFunction(Language::Declaration decl) { any() }
}
/**
* Override of `IRConfiguration` to only evaluate debug strings for the functions that are to be dumped.
*/
private class FilteredIRConfiguration extends IRConfiguration {
override predicate shouldEvaluateDebugStringsForFunction(Language::Function func) {
override predicate shouldEvaluateDebugStringsForFunction(Language::Declaration func) {
shouldPrintFunction(func)
}
}
private predicate shouldPrintFunction(Language::Function func) {
exists(PrintIRConfiguration config | config.shouldPrintFunction(func))
private predicate shouldPrintFunction(Language::Declaration decl) {
exists(PrintIRConfiguration config | config.shouldPrintFunction(decl))
}
private string getAdditionalInstructionProperty(Instruction instr, string key) {

View File

@@ -13,22 +13,20 @@ private newtype TIRFunction =
* phases of the IR. Each instantiation of `IRFunction` extends this class.
*/
class IRFunctionBase extends TIRFunction {
//Language::Function func;
// IRFunctionBase() { this = TFunctionIRFunction(func) }
/** Gets a textual representation of this element. */
final string toString() {
result = "IR: " + any(Language::Function func | this = TFunctionIRFunction(func)).toString()
Language::Declaration decl;
IRFunctionBase() {
this = TFunctionIRFunction(decl)
or
result = "IR: " + any(Language::GlobalVariable var | this = TVarInitIRFunction(var)).toString()
this = TVarInitIRFunction(decl)
}
/** Gets a textual representation of this element. */
final string toString() { result = "IR: " + decl.toString() }
/** Gets the function whose IR is represented. */
final Language::Function getFunction() { this = TFunctionIRFunction(result) }
final Language::Declaration getFunction() { result = decl }
/** Gets the location of the function. */
final Language::Location getLocation() {
result = any(Language::Function func | this = TFunctionIRFunction(func)).getLocation()
or
result = any(Language::GlobalVariable var | this = TVarInitIRFunction(var)).getLocation()
}
final Language::Location getLocation() { result = decl.getLocation() }
}

View File

@@ -97,7 +97,7 @@ class IRBlockBase extends TIRBlock {
/**
* Gets the `Function` that contains this block.
*/
final Language::Function getEnclosingFunction() {
final Language::Declaration getEnclosingFunction() {
result = getFirstInstruction(this).getEnclosingFunction()
}
}

View File

@@ -194,7 +194,7 @@ class Instruction extends Construction::TStageInstruction {
/**
* Gets the function that contains this instruction.
*/
final Language::Function getEnclosingFunction() {
final Language::Declaration getEnclosingFunction() {
result = this.getEnclosingIRFunction().getFunction()
}

View File

@@ -26,20 +26,20 @@ class PrintIRConfiguration extends TPrintIRConfiguration {
* Holds if the IR for `func` should be printed. By default, holds for all
* functions.
*/
predicate shouldPrintFunction(Language::Function func) { any() }
predicate shouldPrintFunction(Language::Declaration decl) { any() }
}
/**
* Override of `IRConfiguration` to only evaluate debug strings for the functions that are to be dumped.
*/
private class FilteredIRConfiguration extends IRConfiguration {
override predicate shouldEvaluateDebugStringsForFunction(Language::Function func) {
override predicate shouldEvaluateDebugStringsForFunction(Language::Declaration func) {
shouldPrintFunction(func)
}
}
private predicate shouldPrintFunction(Language::Function func) {
exists(PrintIRConfiguration config | config.shouldPrintFunction(func))
private predicate shouldPrintFunction(Language::Declaration decl) {
exists(PrintIRConfiguration config | config.shouldPrintFunction(decl))
}
private string getAdditionalInstructionProperty(Instruction instr, string key) {

View File

@@ -802,7 +802,7 @@ abstract class TranslatedElement extends TTranslatedElement {
/**
* Gets the `Function` that contains this element.
*/
abstract Function getFunction();
abstract Declaration getFunction();
/**
* Gets the successor instruction of the instruction that was generated by
@@ -952,3 +952,11 @@ abstract class TranslatedElement extends TTranslatedElement {
*/
final TranslatedElement getParent() { result.getAChild() = this }
}
abstract class TranslatedInstructionContainer extends TranslatedElement {
TranslatedInstructionContainer() {
this instanceof TTranslatedFunction
or
this instanceof TTranslatedGlobalOrNamespaceVarInit
}
}

View File

@@ -13,6 +13,7 @@ private import TranslatedFunction
private import TranslatedInitialization
private import TranslatedFunction
private import TranslatedStmt
private import TranslatedGlobalVar
import TranslatedCall
/**
@@ -79,7 +80,10 @@ abstract class TranslatedExpr extends TranslatedElement {
/** DEPRECATED: Alias for getAst */
deprecated override Locatable getAST() { result = this.getAst() }
final override Function getFunction() { result = expr.getEnclosingFunction() }
final override Declaration getFunction() {
result = expr.getEnclosingFunction() or
result = expr.getEnclosingVariable().(GlobalOrNamespaceVariable)
}
/**
* Gets the expression from which this `TranslatedExpr` is generated.
@@ -89,8 +93,10 @@ abstract class TranslatedExpr extends TranslatedElement {
/**
* Gets the `TranslatedFunction` containing this expression.
*/
final TranslatedFunction getEnclosingFunction() {
final TranslatedInstructionContainer getEnclosingFunction() {
result = getTranslatedFunction(expr.getEnclosingFunction())
or
result = getTranslatedVarInit(expr.getEnclosingVariable())
}
}
@@ -788,7 +794,7 @@ class TranslatedThisExpr extends TranslatedNonConstantExpr {
override IRVariable getInstructionVariable(InstructionTag tag) {
tag = ThisAddressTag() and
result = this.getEnclosingFunction().getThisVariable()
result = this.getEnclosingFunction().(TranslatedFunction).getThisVariable()
}
}
@@ -2523,7 +2529,7 @@ class TranslatedVarArgsStart extends TranslatedNonConstantExpr {
final override IRVariable getInstructionVariable(InstructionTag tag) {
tag = VarArgsStartEllipsisAddressTag() and
result = this.getEnclosingFunction().getEllipsisVariable()
result = this.getEnclosingFunction().(TranslatedFunction).getEllipsisVariable()
}
final override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) {

View File

@@ -58,7 +58,7 @@ predicate hasReturnValue(Function func) { not func.getUnspecifiedType() instance
* Represents the IR translation of a function. This is the root elements for
* all other elements associated with this function.
*/
class TranslatedFunction extends TranslatedElement, TTranslatedFunction {
class TranslatedFunction extends TranslatedInstructionContainer, TTranslatedFunction {
Function func;
TranslatedFunction() { this = TTranslatedFunction(func) }

View File

@@ -0,0 +1,81 @@
import semmle.code.cpp.ir.implementation.raw.internal.TranslatedElement
private import cpp
private import semmle.code.cpp.ir.implementation.IRType
private import semmle.code.cpp.ir.implementation.Opcode
private import semmle.code.cpp.ir.implementation.internal.OperandTag
private import semmle.code.cpp.ir.internal.CppType
private import TranslatedInitialization
private import InstructionTag
class TranslatedGlobalOrNamespaceVarInit extends TranslatedInstructionContainer,
TTranslatedGlobalOrNamespaceVarInit, InitializationContext {
GlobalOrNamespaceVariable var;
TranslatedGlobalOrNamespaceVarInit() { this = TTranslatedGlobalOrNamespaceVarInit(var) }
override string toString() { result = var.toString() }
final override GlobalOrNamespaceVariable getAst() { result = var }
final override Declaration getFunction() { result = var }
final Location getLocation() { result = var.getLocation() }
override Instruction getFirstInstruction() { result = this.getInstruction(EnterFunctionTag()) }
override TranslatedElement getChild(int n) {
n = 1 and result = getTranslatedInitialization(var.getInitializer().getExpr())
}
override predicate hasInstruction(Opcode op, InstructionTag tag, CppType type) {
op instanceof Opcode::EnterFunction and
tag = EnterFunctionTag() and
type = getVoidType()
or
op instanceof Opcode::VariableAddress and
tag = InitializerVariableAddressTag() and
type = getTypeForGLValue(var.getType())
or
op instanceof Opcode::ReturnVoid and
tag = ReturnTag() and
type = getVoidType()
or
op instanceof Opcode::ExitFunction and
tag = ExitFunctionTag() and
type = getVoidType()
}
override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) {
tag = EnterFunctionTag() and
kind instanceof GotoEdge and
result = getInstruction(InitializerVariableAddressTag())
or
tag = InitializerVariableAddressTag() and
kind instanceof GotoEdge and
result = getChild(1).getFirstInstruction()
or
tag = ReturnTag() and
kind instanceof GotoEdge and
result = getInstruction(ExitFunctionTag())
}
override Instruction getChildSuccessor(TranslatedElement child) {
child = getChild(1) and
result = getInstruction(ReturnTag())
}
override IRUserVariable getInstructionVariable(InstructionTag tag) {
tag = InitializerVariableAddressTag() and
result.getVariable() = var
}
override Instruction getTargetAddress() {
result = getInstruction(InitializerVariableAddressTag())
}
override Type getTargetType() { result = var.getType() }
}
TranslatedGlobalOrNamespaceVarInit getTranslatedVarInit(GlobalOrNamespaceVariable var) {
result.getAst() = var
}

View File

@@ -137,7 +137,10 @@ abstract class TranslatedInitialization extends TranslatedElement, TTranslatedIn
final override string toString() { result = "init: " + expr.toString() }
final override Function getFunction() { result = expr.getEnclosingFunction() }
final override Declaration getFunction() {
result = expr.getEnclosingFunction() or
result = expr.getEnclosingVariable().(GlobalOrNamespaceVariable)
}
final override Locatable getAst() { result = expr }
@@ -486,7 +489,10 @@ abstract class TranslatedFieldInitialization extends TranslatedElement {
/** DEPRECATED: Alias for getAst */
deprecated override Locatable getAST() { result = getAst() }
final override Function getFunction() { result = ast.getEnclosingFunction() }
final override Declaration getFunction() {
result = ast.getEnclosingFunction() or
result = ast.getEnclosingVariable().(GlobalOrNamespaceVariable)
}
final override Instruction getFirstInstruction() { result = getInstruction(getFieldAddressTag()) }

View File

@@ -97,7 +97,7 @@ class IRBlockBase extends TIRBlock {
/**
* Gets the `Function` that contains this block.
*/
final Language::Function getEnclosingFunction() {
final Language::Declaration getEnclosingFunction() {
result = getFirstInstruction(this).getEnclosingFunction()
}
}

View File

@@ -194,7 +194,7 @@ class Instruction extends Construction::TStageInstruction {
/**
* Gets the function that contains this instruction.
*/
final Language::Function getEnclosingFunction() {
final Language::Declaration getEnclosingFunction() {
result = this.getEnclosingIRFunction().getFunction()
}

View File

@@ -26,20 +26,20 @@ class PrintIRConfiguration extends TPrintIRConfiguration {
* Holds if the IR for `func` should be printed. By default, holds for all
* functions.
*/
predicate shouldPrintFunction(Language::Function func) { any() }
predicate shouldPrintFunction(Language::Declaration decl) { any() }
}
/**
* Override of `IRConfiguration` to only evaluate debug strings for the functions that are to be dumped.
*/
private class FilteredIRConfiguration extends IRConfiguration {
override predicate shouldEvaluateDebugStringsForFunction(Language::Function func) {
override predicate shouldEvaluateDebugStringsForFunction(Language::Declaration func) {
shouldPrintFunction(func)
}
}
private predicate shouldPrintFunction(Language::Function func) {
exists(PrintIRConfiguration config | config.shouldPrintFunction(func))
private predicate shouldPrintFunction(Language::Declaration decl) {
exists(PrintIRConfiguration config | config.shouldPrintFunction(decl))
}
private string getAdditionalInstructionProperty(Instruction instr, string key) {

View File

@@ -58,6 +58,8 @@ class Field = Cpp::Field;
class BuiltInOperation = Cpp::BuiltInOperation;
class Declaration = Cpp::Declaration;
// TODO: Remove necessity for these.
class Expr = Cpp::Expr;

View File

@@ -3,14 +3,28 @@ unexpectedOperand
duplicateOperand
missingPhiOperand
missingOperandType
| ir.cpp:1038:12:1038:18 | ChiTotal | Operand 'ChiTotal' of instruction 'Chi' is missing a type in function '$@'. | ir.cpp:1038:6:1038:8 | (lambda [] type at line 1038, col. 12) lam | (lambda [] type at line 1038, col. 12) lam |
| ir.cpp:1674:16:1674:16 | ChiTotal | Operand 'ChiTotal' of instruction 'Chi' is missing a type in function '$@'. | ir.cpp:1674:5:1674:12 | int global_2 | int global_2 |
| ir.cpp:1676:22:1676:22 | ChiTotal | Operand 'ChiTotal' of instruction 'Chi' is missing a type in function '$@'. | ir.cpp:1676:11:1676:18 | int const global_3 | int const global_3 |
| struct_init.cpp:10:7:10:9 | ChiTotal | Operand 'ChiTotal' of instruction 'Chi' is missing a type in function '$@'. | struct_init.cpp:9:13:9:25 | Info infos_in_file[] | Info infos_in_file[] |
duplicateChiOperand
sideEffectWithoutPrimary
instructionWithoutSuccessor
| clang.cpp:3:5:3:13 | VariableAddress: globalInt | Instruction 'VariableAddress: globalInt' has no successors in function '$@'. | clang.cpp:3:5:3:13 | int globalInt | int globalInt |
| ir.cpp:346:5:346:5 | VariableAddress: g | Instruction 'VariableAddress: g' has no successors in function '$@'. | ir.cpp:346:5:346:5 | int g | int g |
| ir.cpp:1672:5:1672:12 | VariableAddress: global_1 | Instruction 'VariableAddress: global_1' has no successors in function '$@'. | ir.cpp:1672:5:1672:12 | int global_1 | int global_1 |
| struct_init.cpp:14:7:14:20 | VariableAddress: global_pointer | Instruction 'VariableAddress: global_pointer' has no successors in function '$@'. | struct_init.cpp:14:7:14:20 | Info* global_pointer | Info* global_pointer |
ambiguousSuccessors
unexplainedLoop
unnecessaryPhiInstruction
memoryOperandDefinitionIsUnmodeled
operandAcrossFunctions
| struct_init.cpp:9:13:9:25 | Left | Operand 'Left' is used on instruction 'PointerAdd: {...}' in function '$@', but is defined on instruction 'VariableAddress: infos_in_file' in function '$@'. | file://:0:0:0:0 | <Missing IRFunction> | <Missing IRFunction> | struct_init.cpp:9:13:9:25 | Info infos_in_file[] | Info infos_in_file[] |
| struct_init.cpp:9:13:9:25 | Left | Operand 'Left' is used on instruction 'PointerAdd: {...}' in function '$@', but is defined on instruction 'VariableAddress: infos_in_file' in function '$@'. | file://:0:0:0:0 | <Missing IRFunction> | <Missing IRFunction> | struct_init.cpp:9:13:9:25 | Info infos_in_file[] | Info infos_in_file[] |
| struct_init.cpp:9:31:12:1 | Unary | Operand 'Unary' is used on instruction 'FieldAddress: {...}' in function '$@', but is defined on instruction 'PointerAdd: {...}' in function '$@'. | struct_init.cpp:9:13:9:25 | Info infos_in_file[] | Info infos_in_file[] | file://:0:0:0:0 | <Missing IRFunction> | <Missing IRFunction> |
| struct_init.cpp:9:31:12:1 | Unary | Operand 'Unary' is used on instruction 'FieldAddress: {...}' in function '$@', but is defined on instruction 'PointerAdd: {...}' in function '$@'. | struct_init.cpp:9:13:9:25 | Info infos_in_file[] | Info infos_in_file[] | file://:0:0:0:0 | <Missing IRFunction> | <Missing IRFunction> |
| struct_init.cpp:9:31:12:1 | Unary | Operand 'Unary' is used on instruction 'FieldAddress: {...}' in function '$@', but is defined on instruction 'PointerAdd: {...}' in function '$@'. | struct_init.cpp:9:13:9:25 | Info infos_in_file[] | Info infos_in_file[] | file://:0:0:0:0 | <Missing IRFunction> | <Missing IRFunction> |
| struct_init.cpp:9:31:12:1 | Unary | Operand 'Unary' is used on instruction 'FieldAddress: {...}' in function '$@', but is defined on instruction 'PointerAdd: {...}' in function '$@'. | struct_init.cpp:9:13:9:25 | Info infos_in_file[] | Info infos_in_file[] | file://:0:0:0:0 | <Missing IRFunction> | <Missing IRFunction> |
instructionWithoutUniqueBlock
containsLoopOfForwardEdges
lostReachability
@@ -19,8 +33,20 @@ useNotDominatedByDefinition
switchInstructionWithoutDefaultEdge
notMarkedAsConflated
wronglyMarkedAsConflated
| ir.cpp:1038:12:1038:18 | Chi: [...](...){...} | Instruction 'Chi: [...](...){...}' should not be marked as having a conflated result in function '$@'. | ir.cpp:1038:6:1038:8 | (lambda [] type at line 1038, col. 12) lam | (lambda [] type at line 1038, col. 12) lam |
| ir.cpp:1038:12:1038:18 | Chi: [...](...){...} | Instruction 'Chi: [...](...){...}' should not be marked as having a conflated result in function '$@'. | ir.cpp:1038:6:1038:8 | (lambda [] type at line 1038, col. 12) lam | (lambda [] type at line 1038, col. 12) lam |
| ir.cpp:1674:16:1674:16 | Chi: 1 | Instruction 'Chi: 1' should not be marked as having a conflated result in function '$@'. | ir.cpp:1674:5:1674:12 | int global_2 | int global_2 |
| ir.cpp:1676:22:1676:22 | Chi: 2 | Instruction 'Chi: 2' should not be marked as having a conflated result in function '$@'. | ir.cpp:1676:11:1676:18 | int const global_3 | int const global_3 |
| struct_init.cpp:10:7:10:9 | Chi: array to pointer conversion | Instruction 'Chi: array to pointer conversion' should not be marked as having a conflated result in function '$@'. | struct_init.cpp:9:13:9:25 | Info infos_in_file[] | Info infos_in_file[] |
| struct_init.cpp:10:12:10:19 | Chi: handler1 | Instruction 'Chi: handler1' should not be marked as having a conflated result in function '$@'. | struct_init.cpp:9:13:9:25 | Info infos_in_file[] | Info infos_in_file[] |
| struct_init.cpp:11:7:11:9 | Chi: array to pointer conversion | Instruction 'Chi: array to pointer conversion' should not be marked as having a conflated result in function '$@'. | struct_init.cpp:9:13:9:25 | Info infos_in_file[] | Info infos_in_file[] |
| struct_init.cpp:11:12:11:20 | Chi: & ... | Instruction 'Chi: & ...' should not be marked as having a conflated result in function '$@'. | struct_init.cpp:9:13:9:25 | Info infos_in_file[] | Info infos_in_file[] |
invalidOverlap
nonUniqueEnclosingIRFunction
| struct_init.cpp:9:31:12:1 | Constant: {...} | Instruction 'Constant: {...}' has 0 results for `getEnclosingIRFunction()` in function '$@'. | file://:0:0:0:0 | <Missing IRFunction> | <Missing IRFunction> |
| struct_init.cpp:9:31:12:1 | Constant: {...} | Instruction 'Constant: {...}' has 0 results for `getEnclosingIRFunction()` in function '$@'. | file://:0:0:0:0 | <Missing IRFunction> | <Missing IRFunction> |
| struct_init.cpp:9:31:12:1 | PointerAdd: {...} | Instruction 'PointerAdd: {...}' has 0 results for `getEnclosingIRFunction()` in function '$@'. | file://:0:0:0:0 | <Missing IRFunction> | <Missing IRFunction> |
| struct_init.cpp:9:31:12:1 | PointerAdd: {...} | Instruction 'PointerAdd: {...}' has 0 results for `getEnclosingIRFunction()` in function '$@'. | file://:0:0:0:0 | <Missing IRFunction> | <Missing IRFunction> |
fieldAddressOnNonPointer
thisArgumentIsNonPointer
missingCanonicalLanguageType

View File

@@ -3,14 +3,28 @@ unexpectedOperand
duplicateOperand
missingPhiOperand
missingOperandType
| ir.cpp:1038:12:1038:18 | ChiTotal | Operand 'ChiTotal' of instruction 'Chi' is missing a type in function '$@'. | ir.cpp:1038:6:1038:8 | (lambda [] type at line 1038, col. 12) lam | (lambda [] type at line 1038, col. 12) lam |
| ir.cpp:1674:16:1674:16 | ChiTotal | Operand 'ChiTotal' of instruction 'Chi' is missing a type in function '$@'. | ir.cpp:1674:5:1674:12 | int global_2 | int global_2 |
| ir.cpp:1676:22:1676:22 | ChiTotal | Operand 'ChiTotal' of instruction 'Chi' is missing a type in function '$@'. | ir.cpp:1676:11:1676:18 | int const global_3 | int const global_3 |
| struct_init.cpp:10:7:10:9 | ChiTotal | Operand 'ChiTotal' of instruction 'Chi' is missing a type in function '$@'. | struct_init.cpp:9:13:9:25 | Info infos_in_file[] | Info infos_in_file[] |
duplicateChiOperand
sideEffectWithoutPrimary
instructionWithoutSuccessor
| clang.cpp:3:5:3:13 | VariableAddress: globalInt | Instruction 'VariableAddress: globalInt' has no successors in function '$@'. | clang.cpp:3:5:3:13 | int globalInt | int globalInt |
| ir.cpp:346:5:346:5 | VariableAddress: g | Instruction 'VariableAddress: g' has no successors in function '$@'. | ir.cpp:346:5:346:5 | int g | int g |
| ir.cpp:1672:5:1672:12 | VariableAddress: global_1 | Instruction 'VariableAddress: global_1' has no successors in function '$@'. | ir.cpp:1672:5:1672:12 | int global_1 | int global_1 |
| struct_init.cpp:14:7:14:20 | VariableAddress: global_pointer | Instruction 'VariableAddress: global_pointer' has no successors in function '$@'. | struct_init.cpp:14:7:14:20 | Info* global_pointer | Info* global_pointer |
ambiguousSuccessors
unexplainedLoop
unnecessaryPhiInstruction
memoryOperandDefinitionIsUnmodeled
operandAcrossFunctions
| struct_init.cpp:9:13:9:25 | Left | Operand 'Left' is used on instruction 'PointerAdd: {...}' in function '$@', but is defined on instruction 'VariableAddress: infos_in_file' in function '$@'. | file://:0:0:0:0 | <Missing IRFunction> | <Missing IRFunction> | struct_init.cpp:9:13:9:25 | Info infos_in_file[] | Info infos_in_file[] |
| struct_init.cpp:9:13:9:25 | Left | Operand 'Left' is used on instruction 'PointerAdd: {...}' in function '$@', but is defined on instruction 'VariableAddress: infos_in_file' in function '$@'. | file://:0:0:0:0 | <Missing IRFunction> | <Missing IRFunction> | struct_init.cpp:9:13:9:25 | Info infos_in_file[] | Info infos_in_file[] |
| struct_init.cpp:9:31:12:1 | Unary | Operand 'Unary' is used on instruction 'FieldAddress: {...}' in function '$@', but is defined on instruction 'PointerAdd: {...}' in function '$@'. | struct_init.cpp:9:13:9:25 | Info infos_in_file[] | Info infos_in_file[] | file://:0:0:0:0 | <Missing IRFunction> | <Missing IRFunction> |
| struct_init.cpp:9:31:12:1 | Unary | Operand 'Unary' is used on instruction 'FieldAddress: {...}' in function '$@', but is defined on instruction 'PointerAdd: {...}' in function '$@'. | struct_init.cpp:9:13:9:25 | Info infos_in_file[] | Info infos_in_file[] | file://:0:0:0:0 | <Missing IRFunction> | <Missing IRFunction> |
| struct_init.cpp:9:31:12:1 | Unary | Operand 'Unary' is used on instruction 'FieldAddress: {...}' in function '$@', but is defined on instruction 'PointerAdd: {...}' in function '$@'. | struct_init.cpp:9:13:9:25 | Info infos_in_file[] | Info infos_in_file[] | file://:0:0:0:0 | <Missing IRFunction> | <Missing IRFunction> |
| struct_init.cpp:9:31:12:1 | Unary | Operand 'Unary' is used on instruction 'FieldAddress: {...}' in function '$@', but is defined on instruction 'PointerAdd: {...}' in function '$@'. | struct_init.cpp:9:13:9:25 | Info infos_in_file[] | Info infos_in_file[] | file://:0:0:0:0 | <Missing IRFunction> | <Missing IRFunction> |
instructionWithoutUniqueBlock
containsLoopOfForwardEdges
lostReachability
@@ -19,8 +33,20 @@ useNotDominatedByDefinition
switchInstructionWithoutDefaultEdge
notMarkedAsConflated
wronglyMarkedAsConflated
| ir.cpp:1038:12:1038:18 | Chi: [...](...){...} | Instruction 'Chi: [...](...){...}' should not be marked as having a conflated result in function '$@'. | ir.cpp:1038:6:1038:8 | (lambda [] type at line 1038, col. 12) lam | (lambda [] type at line 1038, col. 12) lam |
| ir.cpp:1038:12:1038:18 | Chi: [...](...){...} | Instruction 'Chi: [...](...){...}' should not be marked as having a conflated result in function '$@'. | ir.cpp:1038:6:1038:8 | (lambda [] type at line 1038, col. 12) lam | (lambda [] type at line 1038, col. 12) lam |
| ir.cpp:1674:16:1674:16 | Chi: 1 | Instruction 'Chi: 1' should not be marked as having a conflated result in function '$@'. | ir.cpp:1674:5:1674:12 | int global_2 | int global_2 |
| ir.cpp:1676:22:1676:22 | Chi: 2 | Instruction 'Chi: 2' should not be marked as having a conflated result in function '$@'. | ir.cpp:1676:11:1676:18 | int const global_3 | int const global_3 |
| struct_init.cpp:10:7:10:9 | Chi: array to pointer conversion | Instruction 'Chi: array to pointer conversion' should not be marked as having a conflated result in function '$@'. | struct_init.cpp:9:13:9:25 | Info infos_in_file[] | Info infos_in_file[] |
| struct_init.cpp:10:12:10:19 | Chi: handler1 | Instruction 'Chi: handler1' should not be marked as having a conflated result in function '$@'. | struct_init.cpp:9:13:9:25 | Info infos_in_file[] | Info infos_in_file[] |
| struct_init.cpp:11:7:11:9 | Chi: array to pointer conversion | Instruction 'Chi: array to pointer conversion' should not be marked as having a conflated result in function '$@'. | struct_init.cpp:9:13:9:25 | Info infos_in_file[] | Info infos_in_file[] |
| struct_init.cpp:11:12:11:20 | Chi: & ... | Instruction 'Chi: & ...' should not be marked as having a conflated result in function '$@'. | struct_init.cpp:9:13:9:25 | Info infos_in_file[] | Info infos_in_file[] |
invalidOverlap
nonUniqueEnclosingIRFunction
| struct_init.cpp:9:31:12:1 | Constant: {...} | Instruction 'Constant: {...}' has 0 results for `getEnclosingIRFunction()` in function '$@'. | file://:0:0:0:0 | <Missing IRFunction> | <Missing IRFunction> |
| struct_init.cpp:9:31:12:1 | Constant: {...} | Instruction 'Constant: {...}' has 0 results for `getEnclosingIRFunction()` in function '$@'. | file://:0:0:0:0 | <Missing IRFunction> | <Missing IRFunction> |
| struct_init.cpp:9:31:12:1 | PointerAdd: {...} | Instruction 'PointerAdd: {...}' has 0 results for `getEnclosingIRFunction()` in function '$@'. | file://:0:0:0:0 | <Missing IRFunction> | <Missing IRFunction> |
| struct_init.cpp:9:31:12:1 | PointerAdd: {...} | Instruction 'PointerAdd: {...}' has 0 results for `getEnclosingIRFunction()` in function '$@'. | file://:0:0:0:0 | <Missing IRFunction> | <Missing IRFunction> |
fieldAddressOnNonPointer
thisArgumentIsNonPointer
missingCanonicalLanguageType

View File

@@ -4658,6 +4658,7 @@
| ir.cpp:1034:6:1034:20 | ChiTotal | total:m1034_2 |
| ir.cpp:1034:6:1034:20 | SideEffect | m1034_3 |
| ir.cpp:1035:15:1035:15 | Address | &:r1035_1 |
| ir.cpp:1038:12:1038:18 | ChiTotal | total:~m? |
| ir.cpp:1038:14:1038:14 | Address | &:r1038_5 |
| ir.cpp:1038:14:1038:14 | Address | &:r1038_5 |
| ir.cpp:1038:14:1038:14 | Address | &:r1038_5 |
@@ -7436,6 +7437,8 @@
| ir.cpp:1668:17:1668:17 | Load | m1661_14 |
| ir.cpp:1668:17:1668:17 | Load | ~m1666_6 |
| ir.cpp:1668:17:1668:17 | StoreValue | r1668_4 |
| ir.cpp:1674:16:1674:16 | ChiTotal | total:~m? |
| ir.cpp:1676:22:1676:22 | ChiTotal | total:~m? |
| perf-regression.cpp:6:3:6:5 | Address | &:r6_5 |
| perf-regression.cpp:6:3:6:5 | Address | &:r6_5 |
| perf-regression.cpp:6:3:6:5 | Address | &:r6_7 |
@@ -7679,6 +7682,7 @@
| smart_ptr.cpp:47:43:47:63 | SideEffect | ~m47_16 |
| smart_ptr.cpp:47:43:47:63 | Unary | r47_5 |
| smart_ptr.cpp:47:43:47:63 | Unary | r47_6 |
| struct_init.cpp:10:7:10:9 | ChiTotal | total:~m? |
| struct_init.cpp:16:6:16:20 | ChiPartial | partial:m16_3 |
| struct_init.cpp:16:6:16:20 | ChiTotal | total:m16_2 |
| struct_init.cpp:16:6:16:20 | SideEffect | ~m17_5 |

View File

@@ -7,11 +7,21 @@ duplicateChiOperand
sideEffectWithoutPrimary
instructionWithoutSuccessor
| ../../../include/memory.h:68:25:68:33 | CopyValue: (reference to) | Instruction 'CopyValue: (reference to)' has no successors in function '$@'. | ../../../include/memory.h:67:5:67:5 | void std::unique_ptr<int, std::default_delete<int>>::~unique_ptr() | void std::unique_ptr<int, std::default_delete<int>>::~unique_ptr() |
| clang.cpp:3:5:3:13 | VariableAddress: globalInt | Instruction 'VariableAddress: globalInt' has no successors in function '$@'. | clang.cpp:3:5:3:13 | int globalInt | int globalInt |
| ir.cpp:346:5:346:5 | VariableAddress: g | Instruction 'VariableAddress: g' has no successors in function '$@'. | ir.cpp:346:5:346:5 | int g | int g |
| ir.cpp:1672:5:1672:12 | VariableAddress: global_1 | Instruction 'VariableAddress: global_1' has no successors in function '$@'. | ir.cpp:1672:5:1672:12 | int global_1 | int global_1 |
| struct_init.cpp:14:7:14:20 | VariableAddress: global_pointer | Instruction 'VariableAddress: global_pointer' has no successors in function '$@'. | struct_init.cpp:14:7:14:20 | Info* global_pointer | Info* global_pointer |
ambiguousSuccessors
unexplainedLoop
unnecessaryPhiInstruction
memoryOperandDefinitionIsUnmodeled
operandAcrossFunctions
| struct_init.cpp:9:13:9:25 | Left | Operand 'Left' is used on instruction 'PointerAdd: {...}' in function '$@', but is defined on instruction 'VariableAddress: infos_in_file' in function '$@'. | file://:0:0:0:0 | <Missing IRFunction> | <Missing IRFunction> | struct_init.cpp:9:13:9:25 | Info infos_in_file[] | Info infos_in_file[] |
| struct_init.cpp:9:13:9:25 | Left | Operand 'Left' is used on instruction 'PointerAdd: {...}' in function '$@', but is defined on instruction 'VariableAddress: infos_in_file' in function '$@'. | file://:0:0:0:0 | <Missing IRFunction> | <Missing IRFunction> | struct_init.cpp:9:13:9:25 | Info infos_in_file[] | Info infos_in_file[] |
| struct_init.cpp:9:31:12:1 | Unary | Operand 'Unary' is used on instruction 'FieldAddress: {...}' in function '$@', but is defined on instruction 'PointerAdd: {...}' in function '$@'. | struct_init.cpp:9:13:9:25 | Info infos_in_file[] | Info infos_in_file[] | file://:0:0:0:0 | <Missing IRFunction> | <Missing IRFunction> |
| struct_init.cpp:9:31:12:1 | Unary | Operand 'Unary' is used on instruction 'FieldAddress: {...}' in function '$@', but is defined on instruction 'PointerAdd: {...}' in function '$@'. | struct_init.cpp:9:13:9:25 | Info infos_in_file[] | Info infos_in_file[] | file://:0:0:0:0 | <Missing IRFunction> | <Missing IRFunction> |
| struct_init.cpp:9:31:12:1 | Unary | Operand 'Unary' is used on instruction 'FieldAddress: {...}' in function '$@', but is defined on instruction 'PointerAdd: {...}' in function '$@'. | struct_init.cpp:9:13:9:25 | Info infos_in_file[] | Info infos_in_file[] | file://:0:0:0:0 | <Missing IRFunction> | <Missing IRFunction> |
| struct_init.cpp:9:31:12:1 | Unary | Operand 'Unary' is used on instruction 'FieldAddress: {...}' in function '$@', but is defined on instruction 'PointerAdd: {...}' in function '$@'. | struct_init.cpp:9:13:9:25 | Info infos_in_file[] | Info infos_in_file[] | file://:0:0:0:0 | <Missing IRFunction> | <Missing IRFunction> |
instructionWithoutUniqueBlock
containsLoopOfForwardEdges
lostReachability
@@ -23,6 +33,10 @@ notMarkedAsConflated
wronglyMarkedAsConflated
invalidOverlap
nonUniqueEnclosingIRFunction
| struct_init.cpp:9:31:12:1 | Constant: {...} | Instruction 'Constant: {...}' has 0 results for `getEnclosingIRFunction()` in function '$@'. | file://:0:0:0:0 | <Missing IRFunction> | <Missing IRFunction> |
| struct_init.cpp:9:31:12:1 | Constant: {...} | Instruction 'Constant: {...}' has 0 results for `getEnclosingIRFunction()` in function '$@'. | file://:0:0:0:0 | <Missing IRFunction> | <Missing IRFunction> |
| struct_init.cpp:9:31:12:1 | PointerAdd: {...} | Instruction 'PointerAdd: {...}' has 0 results for `getEnclosingIRFunction()` in function '$@'. | file://:0:0:0:0 | <Missing IRFunction> | <Missing IRFunction> |
| struct_init.cpp:9:31:12:1 | PointerAdd: {...} | Instruction 'PointerAdd: {...}' has 0 results for `getEnclosingIRFunction()` in function '$@'. | file://:0:0:0:0 | <Missing IRFunction> | <Missing IRFunction> |
fieldAddressOnNonPointer
thisArgumentIsNonPointer
missingCanonicalLanguageType

View File

@@ -107,6 +107,15 @@ bad_asts.cpp:
# 30| v30_6(void) = ExitFunction :
clang.cpp:
# 3| int globalInt
# 3| Block 0
# 3| v3_1(void) = EnterFunction :
# 3| r3_2(glval<int>) = VariableAddress[globalInt] :
# 3| Block 1
# 3| v3_3(void) = ReturnVoid :
# 3| v3_4(void) = ExitFunction :
# 5| int* globalIntAddress()
# 5| Block 0
# 5| v5_1(void) = EnterFunction :
@@ -2192,6 +2201,15 @@ ir.cpp:
# 341| v341_11(void) = AliasedUse : ~m?
# 341| v341_12(void) = ExitFunction :
# 346| int g
# 346| Block 0
# 346| v346_1(void) = EnterFunction :
# 346| r346_2(glval<int>) = VariableAddress[g] :
# 346| Block 1
# 346| v346_3(void) = ReturnVoid :
# 346| v346_4(void) = ExitFunction :
# 348| int* AddressOf()
# 348| Block 0
# 348| v348_1(void) = EnterFunction :
@@ -5616,6 +5634,17 @@ ir.cpp:
# 1034| v1034_5(void) = AliasedUse : ~m?
# 1034| v1034_6(void) = ExitFunction :
# 1038| (lambda [] type at line 1038, col. 12) lam
# 1038| Block 0
# 1038| v1038_1(void) = EnterFunction :
# 1038| r1038_2(glval<decltype([...](...){...})>) = VariableAddress :
# 1038| r1038_3(glval<decltype([...](...){...})>) = VariableAddress :
# 1038| mu1038_4(decltype([...](...){...})) = Uninitialized : &:r1038_3
# 1038| r1038_5(decltype([...](...){...})) = Load[?] : &:r1038_3, ~m?
# 1038| mu1038_6(decltype([...](...){...})) = Store[?] : &:r1038_2, r1038_5
# 1038| v1038_7(void) = ReturnVoid :
# 1038| v1038_8(void) = ExitFunction :
# 1038| void (lambda [] type at line 1038, col. 12)::operator()() const
# 1038| Block 0
# 1038| v1038_1(void) = EnterFunction :
@@ -8664,6 +8693,33 @@ ir.cpp:
# 1645| v1645_5(void) = AliasedUse : ~m?
# 1645| v1645_6(void) = ExitFunction :
# 1672| int global_1
# 1672| Block 0
# 1672| v1672_1(void) = EnterFunction :
# 1672| r1672_2(glval<int>) = VariableAddress :
# 1672| Block 1
# 1672| v1672_3(void) = ReturnVoid :
# 1672| v1672_4(void) = ExitFunction :
# 1674| int global_2
# 1674| Block 0
# 1674| v1674_1(void) = EnterFunction :
# 1674| r1674_2(glval<int>) = VariableAddress :
# 1674| r1674_3(int) = Constant[1] :
# 1674| mu1674_4(int) = Store[?] : &:r1674_2, r1674_3
# 1674| v1674_5(void) = ReturnVoid :
# 1674| v1674_6(void) = ExitFunction :
# 1676| int const global_3
# 1676| Block 0
# 1676| v1676_1(void) = EnterFunction :
# 1676| r1676_2(glval<int>) = VariableAddress :
# 1676| r1676_3(int) = Constant[2] :
# 1676| mu1676_4(int) = Store[?] : &:r1676_2, r1676_3
# 1676| v1676_5(void) = ReturnVoid :
# 1676| v1676_6(void) = ExitFunction :
perf-regression.cpp:
# 6| void Big::Big()
# 6| Block 0
@@ -8885,6 +8941,37 @@ smart_ptr.cpp:
# 28| v28_6(void) = ExitFunction :
struct_init.cpp:
# 9| Info infos_in_file[]
# 9| Block 0
# 9| v9_1(void) = EnterFunction :
# 9| r9_2(glval<Info[]>) = VariableAddress :
# 10| r10_1(glval<char *>) = FieldAddress[name] :
# 10| r10_2(glval<char[2]>) = StringConstant :
# 10| r10_3(char *) = Convert : r10_2
# 10| mu10_4(char *) = Store[?] : &:r10_1, r10_3
# 10| r10_5(glval<..(*)(..)>) = FieldAddress[handler] :
# 10| r10_6(..(*)(..)) = FunctionAddress[handler1] :
# 10| mu10_7(..(*)(..)) = Store[?] : &:r10_5, r10_6
# 11| r11_1(glval<char *>) = FieldAddress[name] :
# 11| r11_2(glval<char[2]>) = StringConstant :
# 11| r11_3(char *) = Convert : r11_2
# 11| mu11_4(char *) = Store[?] : &:r11_1, r11_3
# 11| r11_5(glval<..(*)(..)>) = FieldAddress[handler] :
# 11| r11_6(glval<..()(..)>) = FunctionAddress[handler2] :
# 11| r11_7(..(*)(..)) = CopyValue : r11_6
# 11| mu11_8(..(*)(..)) = Store[?] : &:r11_5, r11_7
# 9| v9_3(void) = ReturnVoid :
# 9| v9_4(void) = ExitFunction :
# 14| Info* global_pointer
# 14| Block 0
# 14| v14_1(void) = EnterFunction :
# 14| r14_2(glval<Info *>) = VariableAddress[global_pointer] :
# 14| Block 1
# 14| v14_3(void) = ReturnVoid :
# 14| v14_4(void) = ExitFunction :
# 16| void let_info_escape(Info*)
# 16| Block 0
# 16| v16_1(void) = EnterFunction :

View File

@@ -7,5 +7,7 @@ private import semmle.code.cpp.ir.implementation.raw.PrintIR
private import PrintConfig
private class PrintConfig extends PrintIRConfiguration {
override predicate shouldPrintFunction(Function func) { shouldDumpFunction(func) }
override predicate shouldPrintFunction(Declaration decl) {
shouldDumpFunction(decl) or decl instanceof GlobalOrNamespaceVariable
}
}

View File

@@ -6,11 +6,21 @@ missingOperandType
duplicateChiOperand
sideEffectWithoutPrimary
instructionWithoutSuccessor
| clang.cpp:3:5:3:13 | VariableAddress: globalInt | Instruction 'VariableAddress: globalInt' has no successors in function '$@'. | clang.cpp:3:5:3:13 | int globalInt | int globalInt |
| ir.cpp:346:5:346:5 | VariableAddress: g | Instruction 'VariableAddress: g' has no successors in function '$@'. | ir.cpp:346:5:346:5 | int g | int g |
| ir.cpp:1672:5:1672:12 | VariableAddress: global_1 | Instruction 'VariableAddress: global_1' has no successors in function '$@'. | ir.cpp:1672:5:1672:12 | int global_1 | int global_1 |
| struct_init.cpp:14:7:14:20 | VariableAddress: global_pointer | Instruction 'VariableAddress: global_pointer' has no successors in function '$@'. | struct_init.cpp:14:7:14:20 | Info* global_pointer | Info* global_pointer |
ambiguousSuccessors
unexplainedLoop
unnecessaryPhiInstruction
memoryOperandDefinitionIsUnmodeled
operandAcrossFunctions
| struct_init.cpp:9:13:9:25 | Left | Operand 'Left' is used on instruction 'PointerAdd: {...}' in function '$@', but is defined on instruction 'VariableAddress: infos_in_file' in function '$@'. | file://:0:0:0:0 | <Missing IRFunction> | <Missing IRFunction> | struct_init.cpp:9:13:9:25 | Info infos_in_file[] | Info infos_in_file[] |
| struct_init.cpp:9:13:9:25 | Left | Operand 'Left' is used on instruction 'PointerAdd: {...}' in function '$@', but is defined on instruction 'VariableAddress: infos_in_file' in function '$@'. | file://:0:0:0:0 | <Missing IRFunction> | <Missing IRFunction> | struct_init.cpp:9:13:9:25 | Info infos_in_file[] | Info infos_in_file[] |
| struct_init.cpp:9:31:12:1 | Unary | Operand 'Unary' is used on instruction 'FieldAddress: {...}' in function '$@', but is defined on instruction 'PointerAdd: {...}' in function '$@'. | struct_init.cpp:9:13:9:25 | Info infos_in_file[] | Info infos_in_file[] | file://:0:0:0:0 | <Missing IRFunction> | <Missing IRFunction> |
| struct_init.cpp:9:31:12:1 | Unary | Operand 'Unary' is used on instruction 'FieldAddress: {...}' in function '$@', but is defined on instruction 'PointerAdd: {...}' in function '$@'. | struct_init.cpp:9:13:9:25 | Info infos_in_file[] | Info infos_in_file[] | file://:0:0:0:0 | <Missing IRFunction> | <Missing IRFunction> |
| struct_init.cpp:9:31:12:1 | Unary | Operand 'Unary' is used on instruction 'FieldAddress: {...}' in function '$@', but is defined on instruction 'PointerAdd: {...}' in function '$@'. | struct_init.cpp:9:13:9:25 | Info infos_in_file[] | Info infos_in_file[] | file://:0:0:0:0 | <Missing IRFunction> | <Missing IRFunction> |
| struct_init.cpp:9:31:12:1 | Unary | Operand 'Unary' is used on instruction 'FieldAddress: {...}' in function '$@', but is defined on instruction 'PointerAdd: {...}' in function '$@'. | struct_init.cpp:9:13:9:25 | Info infos_in_file[] | Info infos_in_file[] | file://:0:0:0:0 | <Missing IRFunction> | <Missing IRFunction> |
instructionWithoutUniqueBlock
containsLoopOfForwardEdges
lostReachability
@@ -21,6 +31,10 @@ notMarkedAsConflated
wronglyMarkedAsConflated
invalidOverlap
nonUniqueEnclosingIRFunction
| struct_init.cpp:9:31:12:1 | Constant: {...} | Instruction 'Constant: {...}' has 0 results for `getEnclosingIRFunction()` in function '$@'. | file://:0:0:0:0 | <Missing IRFunction> | <Missing IRFunction> |
| struct_init.cpp:9:31:12:1 | Constant: {...} | Instruction 'Constant: {...}' has 0 results for `getEnclosingIRFunction()` in function '$@'. | file://:0:0:0:0 | <Missing IRFunction> | <Missing IRFunction> |
| struct_init.cpp:9:31:12:1 | PointerAdd: {...} | Instruction 'PointerAdd: {...}' has 0 results for `getEnclosingIRFunction()` in function '$@'. | file://:0:0:0:0 | <Missing IRFunction> | <Missing IRFunction> |
| struct_init.cpp:9:31:12:1 | PointerAdd: {...} | Instruction 'PointerAdd: {...}' has 0 results for `getEnclosingIRFunction()` in function '$@'. | file://:0:0:0:0 | <Missing IRFunction> | <Missing IRFunction> |
fieldAddressOnNonPointer
thisArgumentIsNonPointer
missingCanonicalLanguageType

View File

@@ -6,11 +6,21 @@ missingOperandType
duplicateChiOperand
sideEffectWithoutPrimary
instructionWithoutSuccessor
| clang.cpp:3:5:3:13 | VariableAddress: globalInt | Instruction 'VariableAddress: globalInt' has no successors in function '$@'. | clang.cpp:3:5:3:13 | int globalInt | int globalInt |
| ir.cpp:346:5:346:5 | VariableAddress: g | Instruction 'VariableAddress: g' has no successors in function '$@'. | ir.cpp:346:5:346:5 | int g | int g |
| ir.cpp:1672:5:1672:12 | VariableAddress: global_1 | Instruction 'VariableAddress: global_1' has no successors in function '$@'. | ir.cpp:1672:5:1672:12 | int global_1 | int global_1 |
| struct_init.cpp:14:7:14:20 | VariableAddress: global_pointer | Instruction 'VariableAddress: global_pointer' has no successors in function '$@'. | struct_init.cpp:14:7:14:20 | Info* global_pointer | Info* global_pointer |
ambiguousSuccessors
unexplainedLoop
unnecessaryPhiInstruction
memoryOperandDefinitionIsUnmodeled
operandAcrossFunctions
| struct_init.cpp:9:13:9:25 | Left | Operand 'Left' is used on instruction 'PointerAdd: {...}' in function '$@', but is defined on instruction 'VariableAddress: infos_in_file' in function '$@'. | file://:0:0:0:0 | <Missing IRFunction> | <Missing IRFunction> | struct_init.cpp:9:13:9:25 | Info infos_in_file[] | Info infos_in_file[] |
| struct_init.cpp:9:13:9:25 | Left | Operand 'Left' is used on instruction 'PointerAdd: {...}' in function '$@', but is defined on instruction 'VariableAddress: infos_in_file' in function '$@'. | file://:0:0:0:0 | <Missing IRFunction> | <Missing IRFunction> | struct_init.cpp:9:13:9:25 | Info infos_in_file[] | Info infos_in_file[] |
| struct_init.cpp:9:31:12:1 | Unary | Operand 'Unary' is used on instruction 'FieldAddress: {...}' in function '$@', but is defined on instruction 'PointerAdd: {...}' in function '$@'. | struct_init.cpp:9:13:9:25 | Info infos_in_file[] | Info infos_in_file[] | file://:0:0:0:0 | <Missing IRFunction> | <Missing IRFunction> |
| struct_init.cpp:9:31:12:1 | Unary | Operand 'Unary' is used on instruction 'FieldAddress: {...}' in function '$@', but is defined on instruction 'PointerAdd: {...}' in function '$@'. | struct_init.cpp:9:13:9:25 | Info infos_in_file[] | Info infos_in_file[] | file://:0:0:0:0 | <Missing IRFunction> | <Missing IRFunction> |
| struct_init.cpp:9:31:12:1 | Unary | Operand 'Unary' is used on instruction 'FieldAddress: {...}' in function '$@', but is defined on instruction 'PointerAdd: {...}' in function '$@'. | struct_init.cpp:9:13:9:25 | Info infos_in_file[] | Info infos_in_file[] | file://:0:0:0:0 | <Missing IRFunction> | <Missing IRFunction> |
| struct_init.cpp:9:31:12:1 | Unary | Operand 'Unary' is used on instruction 'FieldAddress: {...}' in function '$@', but is defined on instruction 'PointerAdd: {...}' in function '$@'. | struct_init.cpp:9:13:9:25 | Info infos_in_file[] | Info infos_in_file[] | file://:0:0:0:0 | <Missing IRFunction> | <Missing IRFunction> |
instructionWithoutUniqueBlock
containsLoopOfForwardEdges
lostReachability
@@ -21,6 +31,10 @@ notMarkedAsConflated
wronglyMarkedAsConflated
invalidOverlap
nonUniqueEnclosingIRFunction
| struct_init.cpp:9:31:12:1 | Constant: {...} | Instruction 'Constant: {...}' has 0 results for `getEnclosingIRFunction()` in function '$@'. | file://:0:0:0:0 | <Missing IRFunction> | <Missing IRFunction> |
| struct_init.cpp:9:31:12:1 | Constant: {...} | Instruction 'Constant: {...}' has 0 results for `getEnclosingIRFunction()` in function '$@'. | file://:0:0:0:0 | <Missing IRFunction> | <Missing IRFunction> |
| struct_init.cpp:9:31:12:1 | PointerAdd: {...} | Instruction 'PointerAdd: {...}' has 0 results for `getEnclosingIRFunction()` in function '$@'. | file://:0:0:0:0 | <Missing IRFunction> | <Missing IRFunction> |
| struct_init.cpp:9:31:12:1 | PointerAdd: {...} | Instruction 'PointerAdd: {...}' has 0 results for `getEnclosingIRFunction()` in function '$@'. | file://:0:0:0:0 | <Missing IRFunction> | <Missing IRFunction> |
fieldAddressOnNonPointer
thisArgumentIsNonPointer
missingCanonicalLanguageType