Merge pull request #4432 from dbartol/dbartol/temporaries/work

C++: Represent temporary object initialization in AST and IR
This commit is contained in:
Ian Lynagh
2020-11-04 14:38:45 +00:00
committed by GitHub
75 changed files with 10939 additions and 4711 deletions

View File

@@ -83,6 +83,8 @@ private predicate pointerToPointerStep(Expr pointerIn, Expr pointerOut) {
or
pointerIn.getConversion() = pointerOut.(ParenthesisExpr)
or
pointerIn.getConversion() = pointerOut.(TemporaryObjectExpr)
or
pointerIn = pointerOut.(ConditionalExpr).getThen().getFullyConverted()
or
pointerIn = pointerOut.(ConditionalExpr).getElse().getFullyConverted()

View File

@@ -81,6 +81,8 @@ private predicate pointerToPointerStep(Expr pointerIn, Expr pointerOut) {
or
pointerIn.getConversion() = pointerOut.(ParenthesisExpr)
or
pointerIn.getConversion() = pointerOut.(TemporaryObjectExpr)
or
pointerIn = pointerOut.(ConditionalExpr).getThen().getFullyConverted()
or
pointerIn = pointerOut.(ConditionalExpr).getElse().getFullyConverted()

View File

@@ -840,6 +840,28 @@ class ArrayToPointerConversion extends Conversion, @array_to_pointer {
override predicate mayBeGloballyImpure() { none() }
}
/**
* A node representing a temporary object created as part of an expression.
*
* This is most commonly seen in the following cases:
* ```c++
* // when binding a reference to a prvalue
* const std::string& r = std::string("text");
*
* // when performing member access on a class prvalue
* strlen(std::string("text").c_str());
*
* // when a prvalue of a type with a destructor is discarded
* s.substr(0, 5); // Return value is discarded but requires destruction
* ```
*/
class TemporaryObjectExpr extends Conversion, @temp_init {
/** Gets a textual representation of this conversion. */
override string toString() { result = "temporary object" }
override string getAPrimaryQlClass() { result = "TemporaryObjectExpr" }
}
/**
* A node representing the Cast sub-class of entity `cast`.
*/

View File

@@ -83,7 +83,7 @@ private class DefaultTaintTrackingCfg extends DataFlow::Configuration {
override predicate isSink(DataFlow::Node sink) { exists(adjustedSink(sink)) }
override predicate isAdditionalFlowStep(DataFlow::Node n1, DataFlow::Node n2) {
instructionTaintStep(n1.asInstruction(), n2.asInstruction())
commonTaintStep(n1, n2)
}
override predicate isBarrier(DataFlow::Node node) { nodeIsBarrier(node) }
@@ -101,7 +101,7 @@ private class ToGlobalVarTaintTrackingCfg extends DataFlow::Configuration {
}
override predicate isAdditionalFlowStep(DataFlow::Node n1, DataFlow::Node n2) {
instructionTaintStep(n1.asInstruction(), n2.asInstruction())
commonTaintStep(n1, n2)
or
writesVariable(n1.asInstruction(), n2.asVariable().(GlobalOrNamespaceVariable))
or
@@ -125,7 +125,7 @@ private class FromGlobalVarTaintTrackingCfg extends DataFlow2::Configuration {
override predicate isSink(DataFlow::Node sink) { exists(adjustedSink(sink)) }
override predicate isAdditionalFlowStep(DataFlow::Node n1, DataFlow::Node n2) {
instructionTaintStep(n1.asInstruction(), n2.asInstruction())
commonTaintStep(n1, n2)
or
// Additional step for flow out of variables. There is no flow _into_
// variables in this configuration, so this step only serves to take flow
@@ -215,19 +215,62 @@ private predicate nodeIsBarrierIn(DataFlow::Node node) {
}
cached
private predicate instructionTaintStep(Instruction i1, Instruction i2) {
private predicate commonTaintStep(DataFlow::Node fromNode, DataFlow::Node toNode) {
instructionToInstructionTaintStep(fromNode.asInstruction(), toNode.asInstruction())
or
operandToInstructionTaintStep(fromNode.asOperand(), toNode.asInstruction())
or
operandToOperandTaintStep(fromNode.asOperand(), toNode.asOperand())
}
private predicate operandToOperandTaintStep(Operand fromOperand, Operand toOperand) {
exists(ReadSideEffectInstruction readInstr |
fromOperand = readInstr.getArgumentOperand() and
toOperand = readInstr.getSideEffectOperand()
)
}
private predicate operandToInstructionTaintStep(Operand fromOperand, Instruction toInstr) {
// Expressions computed from tainted data are also tainted
exists(CallInstruction call, int argIndex | call = i2 |
exists(CallInstruction call, int argIndex | call = toInstr |
isPureFunction(call.getStaticCallTarget().getName()) and
i1 = getACallArgumentOrIndirection(call, argIndex) and
forall(Instruction arg | arg = call.getAnArgument() |
arg = getACallArgumentOrIndirection(call, argIndex) or predictableInstruction(arg)
fromOperand = getACallArgumentOrIndirection(call, argIndex) and
forall(Operand argOperand | argOperand = call.getAnArgumentOperand() |
argOperand = getACallArgumentOrIndirection(call, argIndex) or
predictableInstruction(argOperand.getAnyDef())
) and
// flow through `strlen` tends to cause dubious results, if the length is
// bounded.
not call.getStaticCallTarget().getName() = "strlen"
)
or
// Flow from argument to return value
toInstr =
any(CallInstruction call |
exists(int indexIn |
modelTaintToReturnValue(call.getStaticCallTarget(), indexIn) and
fromOperand = getACallArgumentOrIndirection(call, indexIn) and
not predictableOnlyFlow(call.getStaticCallTarget().getName())
)
)
or
// Flow from input argument to output argument
// TODO: This won't work in practice as long as all aliased memory is tracked
// together in a single virtual variable.
// TODO: Will this work on the test for `TaintedPath.ql`, where the output arg
// is a pointer addition expression?
toInstr =
any(WriteSideEffectInstruction outInstr |
exists(CallInstruction call, int indexIn, int indexOut |
modelTaintToParameter(call.getStaticCallTarget(), indexIn, indexOut) and
fromOperand = getACallArgumentOrIndirection(call, indexIn) and
outInstr.getIndex() = indexOut and
outInstr.getPrimaryInstruction() = call
)
)
}
private predicate instructionToInstructionTaintStep(Instruction i1, Instruction i2) {
// Flow through pointer dereference
i2.(LoadInstruction).getSourceAddress() = i1
or
@@ -291,29 +334,6 @@ private predicate instructionTaintStep(Instruction i1, Instruction i2) {
read.getAnOperand().(SideEffectOperand).getAnyDef() = i1 and
read.getArgumentDef() = i2
)
or
// Flow from argument to return value
i2 =
any(CallInstruction call |
exists(int indexIn |
modelTaintToReturnValue(call.getStaticCallTarget(), indexIn) and
i1 = getACallArgumentOrIndirection(call, indexIn) and
not predictableOnlyFlow(call.getStaticCallTarget().getName())
)
)
or
// Flow from input argument to output argument
// TODO: Will this work on the test for `TaintedPath.ql`, where the output arg
// is a pointer addition expression?
i2 =
any(WriteSideEffectInstruction outNode |
exists(CallInstruction call, int indexIn, int indexOut |
modelTaintToParameter(call.getStaticCallTarget(), indexIn, indexOut) and
i1 = getACallArgumentOrIndirection(call, indexIn) and
outNode.getIndex() = indexOut and
outNode.getPrimaryInstruction() = call
)
)
}
pragma[noinline]
@@ -329,15 +349,25 @@ private InitializeParameterInstruction getInitializeParameter(IRFunction f, Para
}
/**
* Get an instruction that goes into argument `argumentIndex` of `call`. This
* Returns the index of the side effect instruction corresponding to the specified function output,
* if one exists.
*/
private int getWriteSideEffectIndex(FunctionOutput output) {
output.isParameterDeref(result)
or
output.isQualifierObject() and result = -1
}
/**
* Get an operand that goes into argument `argumentIndex` of `call`. This
* can be either directly or through one pointer indirection.
*/
private Instruction getACallArgumentOrIndirection(CallInstruction call, int argumentIndex) {
result = call.getPositionalArgument(argumentIndex)
private Operand getACallArgumentOrIndirection(CallInstruction call, int argumentIndex) {
result = call.getPositionalArgumentOperand(argumentIndex)
or
exists(ReadSideEffectInstruction readSE |
// TODO: why are read side effect operands imprecise?
result = readSE.getSideEffectOperand().getAnyDef() and
result = readSE.getSideEffectOperand() and
readSE.getPrimaryInstruction() = call and
readSE.getIndex() = argumentIndex
)
@@ -351,7 +381,7 @@ private predicate modelTaintToParameter(Function f, int parameterIn, int paramet
f.(TaintFunction).hasTaintFlow(modelIn, modelOut)
) and
(modelIn.isParameter(parameterIn) or modelIn.isParameterDeref(parameterIn)) and
modelOut.isParameterDeref(parameterOut)
parameterOut = getWriteSideEffectIndex(modelOut)
)
}
@@ -540,7 +570,7 @@ module TaintedWithPath {
}
override predicate isAdditionalFlowStep(DataFlow::Node n1, DataFlow::Node n2) {
instructionTaintStep(n1.asInstruction(), n2.asInstruction())
commonTaintStep(n1, n2)
or
exists(TaintTrackingConfiguration cfg | cfg.taintThroughGlobals() |
writesVariable(n1.asInstruction(), n2.asVariable().(GlobalOrNamespaceVariable))

View File

@@ -494,4 +494,34 @@ module InstructionConsistency {
irFunc = getInstructionIRFunction(instr, irFuncText)
)
}
/**
* Holds if the object address operand for the given `FieldAddress` instruction does not have an
* address type.
*/
query predicate fieldAddressOnNonPointer(
FieldAddressInstruction instr, string message, OptionalIRFunction irFunc, string irFuncText
) {
not instr.getObjectAddressOperand().getIRType() instanceof IRAddressType and
message =
"FieldAddress instruction '" + instr.toString() +
"' has an object address operand that is not an address, in function '$@'." and
irFunc = getInstructionIRFunction(instr, irFuncText)
}
/**
* Holds if the `this` argument operand for the given `Call` instruction does not have an address
* type.
*/
query predicate thisArgumentIsNonPointer(
CallInstruction instr, string message, OptionalIRFunction irFunc, string irFuncText
) {
exists(ThisArgumentOperand thisOperand | thisOperand = instr.getThisArgumentOperand() |
not thisOperand.getIRType() instanceof IRAddressType
) and
message =
"Call instruction '" + instr.toString() +
"' has a `this` argument operand that is not an address, in function '$@'." and
irFunc = getInstructionIRFunction(instr, irFuncText)
}
}

View File

@@ -494,4 +494,34 @@ module InstructionConsistency {
irFunc = getInstructionIRFunction(instr, irFuncText)
)
}
/**
* Holds if the object address operand for the given `FieldAddress` instruction does not have an
* address type.
*/
query predicate fieldAddressOnNonPointer(
FieldAddressInstruction instr, string message, OptionalIRFunction irFunc, string irFuncText
) {
not instr.getObjectAddressOperand().getIRType() instanceof IRAddressType and
message =
"FieldAddress instruction '" + instr.toString() +
"' has an object address operand that is not an address, in function '$@'." and
irFunc = getInstructionIRFunction(instr, irFuncText)
}
/**
* Holds if the `this` argument operand for the given `Call` instruction does not have an address
* type.
*/
query predicate thisArgumentIsNonPointer(
CallInstruction instr, string message, OptionalIRFunction irFunc, string irFuncText
) {
exists(ThisArgumentOperand thisOperand | thisOperand = instr.getThisArgumentOperand() |
not thisOperand.getIRType() instanceof IRAddressType
) and
message =
"Call instruction '" + instr.toString() +
"' has a `this` argument operand that is not an address, in function '$@'." and
irFunc = getInstructionIRFunction(instr, irFuncText)
}
}

View File

@@ -8,6 +8,16 @@ private import TranslatedElement
private import TranslatedExpr
private import TranslatedFunction
/**
* Gets the `CallInstruction` from the `TranslatedCallExpr` for the specified expression.
*/
private CallInstruction getTranslatedCallInstruction(Call call) {
exists(TranslatedCallExpr translatedCall |
translatedCall.getExpr() = call and
result = translatedCall.getInstruction(CallTag())
)
}
/**
* The IR translation of a call to a function. The call may be from an actual
* call in the source code, or could be a call that is part of the translation
@@ -388,7 +398,7 @@ class TranslatedAllocationSideEffects extends TranslatedSideEffects,
tag = OnlyInstructionTag() and
if expr instanceof NewOrNewArrayExpr
then result = getTranslatedAllocatorCall(expr).getInstruction(CallTag())
else result = getTranslatedExpr(expr).getInstruction(CallTag())
else result = getTranslatedCallInstruction(expr)
}
}
@@ -409,7 +419,7 @@ class TranslatedCallSideEffects extends TranslatedSideEffects, TTranslatedCallSi
override Instruction getPrimaryInstructionForSideEffect(InstructionTag tag) {
tag = OnlyInstructionTag() and
result = getTranslatedExpr(expr).getInstruction(CallTag())
result = getTranslatedCallInstruction(expr)
}
}
@@ -599,7 +609,7 @@ class TranslatedSideEffect extends TranslatedElement, TTranslatedArgumentSideEff
override Instruction getPrimaryInstructionForSideEffect(InstructionTag tag) {
tag = OnlyInstructionTag() and
result = getTranslatedExpr(call).getInstruction(CallTag())
result = getTranslatedCallInstruction(call)
}
final override int getInstructionIndex(InstructionTag tag) {

View File

@@ -227,6 +227,125 @@ private predicate usedAsCondition(Expr expr) {
)
}
/**
* Holds if `conv` is an `InheritanceConversion` that requires a `TranslatedLoad`, despite not being
* marked as having an lvalue-to-rvalue conversion.
*
* This is necessary for an `InheritanceConversion` that is originally modeled as a
* prvalue-to-prvalue conversion, since we transform it into a glvalue-to-glvalue conversion. If it
* is actually consumed as a prvalue, such as on the right hand side of an assignment, we need to
* load the resulting glvalue.
*/
private predicate isInheritanceConversionWithImplicitLoad(InheritanceConversion conv) {
// Must have originally been a prvalue-to-prvalue conversion.
isClassPRValue(conv.getExpr()) and
not conv.hasLValueToRValueConversion() and
// Exclude that case where this will be consumed as a glvalue, such as when used as the qualifier
// of a field access.
not isPRValueConversionOnGLValue(conv)
}
/**
* Holds if `expr` is the result of a field access whose qualifier was a prvalue and whose result is
* a prvalue. These accesses are not marked as having loads, but we do need a load in the IR.
*/
private predicate isPRValueFieldAccessWithImplicitLoad(Expr expr) {
expr instanceof ValueFieldAccess and
expr.isPRValueCategory() and
// No need to do a load if we're replacing the result with a constant anyway.
not isIRConstant(expr) and
// Model an array prvalue as the address of the array, just like an array glvalue.
not expr.getUnspecifiedType() instanceof ArrayType
}
/**
* Holds if `expr` is a prvalue of class type.
*
* This same test is used in several places.
*/
pragma[inline]
private predicate isClassPRValue(Expr expr) {
expr.isPRValueCategory() and
expr.getUnspecifiedType() instanceof Class
}
/**
* Holds if `expr` is consumed as a glvalue by its parent. If `expr` is actually a prvalue, it will
* have any lvalue-to-rvalue conversion ignored. If it does not have an lvalue-to-rvalue conversion,
* it will be materialized into a temporary object.
*/
private predicate consumedAsGLValue(Expr expr) {
isClassPRValue(expr) and
(
// Qualifier of a field access.
expr = any(FieldAccess a).getQualifier().getFullyConverted()
or
// Qualifier of a member function call.
expr = any(Call c).getQualifier().getFullyConverted()
or
// The operand of an inheritance conversion.
expr = any(InheritanceConversion c).getExpr()
)
}
/**
* Holds if `expr` is a conversion that is originally a prvalue-to-prvalue conversion, but which is
* applied to a prvalue that will actually be consumed as a glvalue.
*/
predicate isPRValueConversionOnGLValue(Conversion conv) {
exists(Expr consumed |
consumedAsGLValue(consumed) and
isClassPRValue(conv.getExpr()) and
(
// Example: The conversion of `std::string` to `const std::string` when evaluating
// `std::string("foo").c_str()`.
conv instanceof PrvalueAdjustmentConversion
or
// Parentheses are transparent.
conv instanceof ParenthesisExpr
or
// Example: The base class conversion in `f().m()`, when `m` is member function of a base
// class of the return type of `f()`.
conv instanceof InheritanceConversion
) and
(
// Base case: The conversion is consumed directly.
conv = consumed
or
// Recursive case: The conversion is the operand of another prvalue conversion.
isPRValueConversionOnGLValue(conv.getConversion())
)
)
}
/**
* Holds if `expr` is a prvalue of class type that is used in a context that requires a glvalue.
*
* Any conversions between `expr` and the ancestor that consumes the glvalue will also be treated
* as glvalues, but are not part of this relation.
*
* For example:
* ```c++
* std::string("s").c_str();
* ```
* The object for the qualifier is a prvalue(load) of type `std::string`, but the actual
* fully-converted qualifier of the call to `c_str()` is a prvalue adjustment conversion that
* converts the type to `const std::string` to match the type of the `this` pointer of the
* member function. In this case, `mustTransformToGLValue()` will hold for the temporary
* `std::string` object, but not the prvalue adjustment on top of it.
* `isPRValueConversionOnGLValue()` would hold for the prvalue adjustment.
*/
private predicate mustTransformToGLValue(Expr expr) {
not isPRValueConversionOnGLValue(expr) and
(
// The expression is the fully converted qualifier, with no prvalue adjustments on top.
consumedAsGLValue(expr)
or
// The expression has conversions on top, but they are all prvalue adjustments.
isPRValueConversionOnGLValue(expr.getConversion())
)
}
/**
* Holds if `expr` has an lvalue-to-rvalue conversion that should be ignored
* when generating IR. This occurs for conversion from an lvalue of function type
@@ -234,15 +353,24 @@ private predicate usedAsCondition(Expr expr) {
* AST as an lvalue-to-rvalue conversion, but the IR represents both a function
* lvalue and a function pointer prvalue the same.
*/
private predicate ignoreLoad(Expr expr) {
predicate ignoreLoad(Expr expr) {
expr.hasLValueToRValueConversion() and
(
expr instanceof ThisExpr or
expr instanceof FunctionAccess or
expr instanceof ThisExpr
or
expr instanceof FunctionAccess
or
expr.(PointerDereferenceExpr).getOperand().getFullyConverted().getType().getUnspecifiedType()
instanceof FunctionPointerType or
instanceof FunctionPointerType
or
expr.(ReferenceDereferenceExpr).getExpr().getType().getUnspecifiedType() instanceof
FunctionReferenceType
or
// The extractor represents the qualifier of a field access or member function call as a load of
// the temporary object if the original qualifier was a prvalue. For IR purposes, we always want
// to use the address of the temporary object as the qualifier of a field access or the `this`
// argument to a member function call.
mustTransformToGLValue(expr)
)
}
@@ -257,6 +385,17 @@ private predicate needsLoadForParentExpr(Expr expr) {
exists(CrementOperation crement | expr = crement.getOperand().getFullyConverted())
or
exists(AssignOperation ao | expr = ao.getLValue().getFullyConverted())
or
// For arguments that are passed by value but require a constructor call, the extractor emits a
// `TemporaryObjectExpr` as the argument, and marks it as a glvalue. This is roughly how a code-
// generating compiler would implement this, passing the address of the temporary so that the
// callee is using the exact same memory location allocated by the caller. We don't fully model
// this yet, though, so we'll synthesize a load so that we appear to be passing the temporary
// object via a bitwise copy.
exists(Call call |
expr = call.getAnArgument().getFullyConverted().(TemporaryObjectExpr) and
expr.isGLValueCategory()
)
}
/**
@@ -267,6 +406,10 @@ predicate hasTranslatedLoad(Expr expr) {
expr.hasLValueToRValueConversion()
or
needsLoadForParentExpr(expr)
or
isPRValueFieldAccessWithImplicitLoad(expr)
or
isInheritanceConversionWithImplicitLoad(expr)
) and
not ignoreExpr(expr) and
not isNativeCondition(expr) and
@@ -274,6 +417,16 @@ predicate hasTranslatedLoad(Expr expr) {
not ignoreLoad(expr)
}
/**
* Holds if `expr` should have a `TranslatedSyntheticTemporaryObject` on it.
*/
predicate hasTranslatedSyntheticTemporaryObject(Expr expr) {
not ignoreExpr(expr) and
mustTransformToGLValue(expr) and
// If it's a load, we'll just ignore the load in `ignoreLoad()`.
not expr.hasLValueToRValueConversion()
}
/**
* Holds if the specified `DeclarationEntry` needs an IR translation. An IR translation is only
* necessary for automatic local variables, or for static local variables with dynamic
@@ -304,6 +457,9 @@ newtype TTranslatedElement =
// A separate element to handle the lvalue-to-rvalue conversion step of an
// expression.
TTranslatedLoad(Expr expr) { hasTranslatedLoad(expr) } or
// A temporary object that we had to synthesize ourselves, so that we could do a field access or
// method call on a prvalue.
TTranslatedSyntheticTemporaryObject(Expr expr) { hasTranslatedSyntheticTemporaryObject(expr) } or
// For expressions that would not otherwise generate an instruction.
TTranslatedResultCopy(Expr expr) {
not ignoreExpr(expr) and
@@ -351,6 +507,7 @@ newtype TTranslatedElement =
exists(ConstructorFieldInit fieldInit | fieldInit.getExpr().getFullyConverted() = expr) or
exists(NewExpr newExpr | newExpr.getInitializer().getFullyConverted() = expr) or
exists(ThrowExpr throw | throw.getExpr().getFullyConverted() = expr) or
exists(TemporaryObjectExpr temp | temp.getExpr() = expr) or
exists(LambdaExpression lambda | lambda.getInitializer().getFullyConverted() = expr)
)
} or

View File

@@ -15,8 +15,9 @@ private import TranslatedStmt
import TranslatedCall
/**
* Gets the TranslatedExpr for the specified expression. If `expr` is a load,
* the result is the TranslatedExpr for the load portion.
* Gets the TranslatedExpr for the specified expression. If `expr` is a load or synthesized
* temporary object, the result is the TranslatedExpr for the load or synthetic temporary object
* portion.
*/
TranslatedExpr getTranslatedExpr(Expr expr) {
result.getExpr() = expr and
@@ -107,12 +108,17 @@ abstract class TranslatedCoreExpr extends TranslatedExpr {
// If this TranslatedExpr doesn't produce the result, then it must represent
// a glvalue that is then loaded by a TranslatedLoad.
hasTranslatedLoad(expr)
or
// The expression should be treated as a glvalue because its operand was forced to be a glvalue,
// such as for the qualifier of a member access.
isPRValueConversionOnGLValue(expr)
}
final override predicate producesExprResult() {
// If there's no load, then this is the only TranslatedExpr for this
// If there's no load or temp object, then this is the only TranslatedExpr for this
// expression.
not hasTranslatedLoad(expr) and
not hasTranslatedSyntheticTemporaryObject(expr) and
// If there's a result copy, then this expression's result is the copy.
not exprNeedsCopyIfNotLoaded(expr)
}
@@ -246,19 +252,35 @@ class TranslatedConditionValue extends TranslatedCoreExpr, ConditionContext,
private TranslatedCondition getCondition() { result = getTranslatedCondition(expr) }
}
/**
* The IR translation of a node synthesized to adjust the value category of its operand.
* One of:
* - `TranslatedLoad` - Convert from glvalue to prvalue by loading from the location.
* - `TranslatedSyntheticTemporaryObject` - Convert from prvalue to glvalue by storing to a
* temporary variable.
*/
abstract class TranslatedValueCategoryAdjustment extends TranslatedExpr {
final override Instruction getFirstInstruction() { result = getOperand().getFirstInstruction() }
final override TranslatedElement getChild(int id) { id = 0 and result = getOperand() }
final override predicate producesExprResult() {
// A temp object always produces the result of the expression.
any()
}
final TranslatedCoreExpr getOperand() { result.getExpr() = expr }
}
/**
* IR translation of an implicit lvalue-to-rvalue conversion on the result of
* an expression.
*/
class TranslatedLoad extends TranslatedExpr, TTranslatedLoad {
class TranslatedLoad extends TranslatedValueCategoryAdjustment, TTranslatedLoad {
TranslatedLoad() { this = TTranslatedLoad(expr) }
override string toString() { result = "Load of " + expr.toString() }
override Instruction getFirstInstruction() { result = getOperand().getFirstInstruction() }
override TranslatedElement getChild(int id) { id = 0 and result = getOperand() }
override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) {
tag = LoadTag() and
opcode instanceof Opcode::Load and
@@ -286,18 +308,75 @@ class TranslatedLoad extends TranslatedExpr, TTranslatedLoad {
result = getOperand().getResult()
)
}
final override predicate producesExprResult() {
// A load always produces the result of the expression.
any()
}
TranslatedCoreExpr getOperand() { result.getExpr() = expr }
}
/**
* IR translation of an implicit lvalue-to-rvalue conversion on the result of
* an expression.
* The IR translation of a temporary object synthesized by the IR to hold a class prvalue on which
* a member access is going to be performed. This differs from `TranslatedTemporaryObjectExpr` in
* that instances of `TranslatedSyntheticTemporaryObject` are synthesized during IR construction,
* whereas `TranslatedTemporaryObjectExpr` instances are created from `TemporaryObjectExpr` nodes
* from the AST.
*/
class TranslatedSyntheticTemporaryObject extends TranslatedValueCategoryAdjustment,
TTranslatedSyntheticTemporaryObject {
TranslatedSyntheticTemporaryObject() { this = TTranslatedSyntheticTemporaryObject(expr) }
override string toString() { result = "Temporary materialization of " + expr.toString() }
override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) {
tag = InitializerVariableAddressTag() and
opcode instanceof Opcode::VariableAddress and
resultType = getTypeForGLValue(expr.getType())
or
tag = InitializerStoreTag() and
opcode instanceof Opcode::Store and
resultType = getTypeForPRValue(expr.getType())
}
override predicate isResultGLValue() { any() }
override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) {
tag = InitializerVariableAddressTag() and
result = getInstruction(InitializerStoreTag()) and
kind instanceof GotoEdge
or
tag = InitializerStoreTag() and
result = getParent().getChildSuccessor(this) and
kind instanceof GotoEdge
}
override Instruction getChildSuccessor(TranslatedElement child) {
child = getOperand() and result = getInstruction(InitializerVariableAddressTag())
}
override Instruction getResult() { result = getInstruction(InitializerVariableAddressTag()) }
override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) {
tag = InitializerStoreTag() and
(
operandTag instanceof AddressOperandTag and
result = getInstruction(InitializerVariableAddressTag())
or
operandTag instanceof StoreValueOperandTag and
result = getOperand().getResult()
)
}
final override predicate hasTempVariable(TempVariableTag tag, CppType type) {
tag = TempObjectTempVar() and
type = getTypeForPRValue(expr.getType())
}
final override IRVariable getInstructionVariable(InstructionTag tag) {
tag = InitializerVariableAddressTag() and
result = getIRTempVariable(expr, TempObjectTempVar())
}
}
/**
* IR translation of an expression that simply returns its result. We generate an otherwise useless
* `CopyValue` instruction for these expressions so that there is at least one instruction
* associated with the expression.
*/
class TranslatedResultCopy extends TranslatedExpr, TTranslatedResultCopy {
TranslatedResultCopy() { this = TTranslatedResultCopy(expr) }
@@ -2049,6 +2128,38 @@ class TranslatedBinaryConditionalExpr extends TranslatedConditionalExpr {
}
}
/**
* IR translation of the materialization of a temporary object.
*
* This translation allocates a temporary variable, and initializes it treating `expr.getExpr()` as
* its initializer.
*/
class TranslatedTemporaryObjectExpr extends TranslatedNonConstantExpr,
TranslatedVariableInitialization {
override TemporaryObjectExpr expr;
final override predicate hasTempVariable(TempVariableTag tag, CppType type) {
tag = TempObjectTempVar() and
type = getTypeForPRValue(expr.getType())
}
override Type getTargetType() { result = expr.getType() }
final override TranslatedInitialization getInitialization() {
result = getTranslatedInitialization(expr.getExpr())
}
final override IRVariable getIRVariable() {
result = getIRTempVariable(expr, TempObjectTempVar())
}
final override Instruction getInitializationSuccessor() {
result = getParent().getChildSuccessor(this)
}
final override Instruction getResult() { result = getTargetAddress() }
}
/**
* IR translation of a `throw` expression.
*/

View File

@@ -494,4 +494,34 @@ module InstructionConsistency {
irFunc = getInstructionIRFunction(instr, irFuncText)
)
}
/**
* Holds if the object address operand for the given `FieldAddress` instruction does not have an
* address type.
*/
query predicate fieldAddressOnNonPointer(
FieldAddressInstruction instr, string message, OptionalIRFunction irFunc, string irFuncText
) {
not instr.getObjectAddressOperand().getIRType() instanceof IRAddressType and
message =
"FieldAddress instruction '" + instr.toString() +
"' has an object address operand that is not an address, in function '$@'." and
irFunc = getInstructionIRFunction(instr, irFuncText)
}
/**
* Holds if the `this` argument operand for the given `Call` instruction does not have an address
* type.
*/
query predicate thisArgumentIsNonPointer(
CallInstruction instr, string message, OptionalIRFunction irFunc, string irFuncText
) {
exists(ThisArgumentOperand thisOperand | thisOperand = instr.getThisArgumentOperand() |
not thisOperand.getIRType() instanceof IRAddressType
) and
message =
"Call instruction '" + instr.toString() +
"' has a `this` argument operand that is not an address, in function '$@'." and
irFunc = getInstructionIRFunction(instr, irFuncText)
}
}

View File

@@ -4,7 +4,8 @@ newtype TTempVariableTag =
ThrowTempVar() or
LambdaTempVar() or
EllipsisTempVar() or
ThisTempVar()
ThisTempVar() or
TempObjectTempVar()
string getTempVariableTagId(TTempVariableTag tag) {
tag = ConditionValueTempVar() and result = "CondVal"
@@ -18,4 +19,6 @@ string getTempVariableTagId(TTempVariableTag tag) {
tag = EllipsisTempVar() and result = "Ellipsis"
or
tag = ThisTempVar() and result = "This"
or
tag = TempObjectTempVar() and result = "Temp"
}

View File

@@ -35,7 +35,11 @@ class ConversionConstructorModel extends Constructor, TaintFunction {
class CopyConstructorModel extends CopyConstructor, DataFlowFunction {
override predicate hasDataFlow(FunctionInput input, FunctionOutput output) {
// data flow from the first constructor argument to the returned object
input.isParameter(0) and
(
input.isParameter(0)
or
input.isParameterDeref(0)
) and
(
output.isReturnValue()
or
@@ -50,7 +54,11 @@ class CopyConstructorModel extends CopyConstructor, DataFlowFunction {
class MoveConstructorModel extends MoveConstructor, DataFlowFunction {
override predicate hasDataFlow(FunctionInput input, FunctionOutput output) {
// data flow from the first constructor argument to the returned object
input.isParameter(0) and
(
input.isParameter(0)
or
input.isParameterDeref(0)
) and
(
output.isReturnValue()
or

View File

@@ -17,7 +17,11 @@ class MakeUniqueOrShared extends TaintFunction {
// Exclude the specializations of `std::make_shared` and `std::make_unique` that allocate arrays
// since these just take a size argument, which we don't want to propagate taint through.
not this.isArray() and
input.isParameter([0 .. getNumberOfParameters() - 1]) and
(
input.isParameter([0 .. getNumberOfParameters() - 1])
or
input.isParameterDeref([0 .. getNumberOfParameters() - 1])
) and
output.isReturnValue()
}

View File

@@ -4,6 +4,36 @@
import semmle.code.cpp.models.interfaces.Taint
/**
* An instantiation of `std::pair<T1, T2>`.
*/
class StdPairClass extends ClassTemplateInstantiation {
StdPairClass() { getTemplate().hasQualifiedName("std", "pair") }
}
/**
* Any of the single-parameter constructors of `std::pair` that takes a reference to an
* instantiation of `std::pair`. These constructors allow conversion between pair types when the
* underlying element types are convertible.
*/
class StdPairCopyishConstructor extends Constructor, TaintFunction {
StdPairCopyishConstructor() {
this.getDeclaringType() instanceof StdPairClass and
this.getNumberOfParameters() = 1 and
this.getParameter(0).getUnspecifiedType().(ReferenceType).getBaseType() instanceof StdPairClass
}
override predicate hasTaintFlow(FunctionInput input, FunctionOutput output) {
// taint flow from the source object to the constructed object
input.isParameterDeref(0) and
(
output.isReturnValue()
or
output.isQualifierObject()
)
}
}
/**
* Additional model for `std::pair` constructors.
*/

View File

@@ -61,7 +61,7 @@ class StdSetEmplace extends TaintFunction {
// flow from any parameter to qualifier and return value
// (here we assume taint flow from any constructor parameter to the constructed object)
// (where the return value is a pair, this should really flow just to the first part of it)
input.isParameter([0 .. getNumberOfParameters() - 1]) and
input.isParameterDeref([0 .. getNumberOfParameters() - 1]) and
(
output.isQualifierObject() or
output.isReturnValue()

View File

@@ -30,10 +30,19 @@ class StdStringConstructor extends Constructor, TaintFunction {
* character).
*/
int getAStringParameterIndex() {
getParameter(result).getType() instanceof PointerType or // e.g. `std::basic_string::CharT *`
getParameter(result).getType() instanceof ReferenceType or // e.g. `std::basic_string &`
getParameter(result).getUnspecifiedType() =
getDeclaringType().getTemplateArgument(0).(Type).getUnspecifiedType() // i.e. `std::basic_string::CharT`
exists(Type paramType | paramType = getParameter(result).getUnspecifiedType() |
// e.g. `std::basic_string::CharT *`
paramType instanceof PointerType
or
// e.g. `std::basic_string &`, avoiding `const Allocator&`
paramType instanceof ReferenceType and
not paramType.(ReferenceType).getBaseType() =
getDeclaringType().getTemplateArgument(2).(Type).getUnspecifiedType()
or
// i.e. `std::basic_string::CharT`
getParameter(result).getUnspecifiedType() =
getDeclaringType().getTemplateArgument(0).(Type).getUnspecifiedType()
)
}
/**

View File

@@ -1171,6 +1171,7 @@ conversionkinds(
| @parexpr
| @reference_to
| @ref_indirect
| @temp_init
;
/*
@@ -1673,6 +1674,7 @@ case @expr.kind of
| 326 = @spaceshipexpr
| 327 = @co_await
| 328 = @co_yield
| 329 = @temp_init
;
@var_args_expr = @vastartexpr

File diff suppressed because it is too large Load Diff

View File

@@ -4,3 +4,4 @@
| test.cpp:4:9:4:9 | this |
| test.cpp:4:9:4:11 | call to expression |
| test.cpp:10:5:10:11 | call to Foo |
| test.cpp:10:5:10:11 | temporary object |

View File

@@ -122,7 +122,7 @@
| conversions.cpp:179:36:179:37 | (..:: *)... | pointer-to-member derived class conversion | prval | ..:: * | ..:: * |
| conversions.cpp:180:10:180:47 | static_cast<..:: *>... | pointer-to-member derived class conversion | prval | ..:: * | ..:: * |
| conversions.cpp:180:43:180:46 | (..:: *)... | pointer-to-member derived class conversion | prval | ..:: * | ..:: * |
| conversions.cpp:190:22:190:29 | (const String)... | glvalue conversion | lval | const String | void |
| conversions.cpp:190:22:190:29 | (const String)... | glvalue conversion | lval | const String | String |
| conversions.cpp:193:20:193:31 | (const Base)... | glvalue conversion | lval | const Base | Base |
| conversions.cpp:193:31:193:31 | (Base)... | base class conversion | lval | Base | Middle |
| conversions.cpp:193:31:193:31 | (Middle)... | base class conversion | lval | Middle | Derived |

View File

@@ -9,7 +9,7 @@
int main(int argc, char *argv[]) {
int main() {

View File

@@ -71,9 +71,9 @@ void test_string()
sink(a); // tainted
sink(b);
sink(c); // tainted [NOT DETECTED]
sink(c); // tainted
sink(b.c_str());
sink(c.c_str()); // tainted [NOT DETECTED]
sink(c.c_str()); // tainted
}
void test_stringstream()
@@ -91,12 +91,12 @@ void test_stringstream()
sink(ss2); // tainted
sink(ss3); // tainted [NOT DETECTED]
sink(ss4); // tainted
sink(ss5); // tainted [NOT DETECTED]
sink(ss5); // tainted
sink(ss1.str());
sink(ss2.str()); // tainted
sink(ss3.str()); // tainted [NOT DETECTED]
sink(ss4.str()); // tainted
sink(ss5.str()); // tainted [NOT DETECTED]
sink(ss5.str()); // tainted
}
void test_stringstream_int(int source)
@@ -123,14 +123,14 @@ void sink(const char *filename, const char *mode);
void test_strings2()
{
string path1 = user_input();
sink(path1.c_str(), "r"); // tainted [NOT DETECTED]
sink(path1.c_str(), "r"); // tainted
string path2;
path2 = user_input();
sink(path2.c_str(), "r"); // tainted
string path3(user_input());
sink(path3.c_str(), "r"); // tainted [NOT DETECTED]
sink(path3.c_str(), "r"); // tainted
}
void test_string3()
@@ -141,7 +141,7 @@ void test_string3()
std::string ss(cs);
sink(cs); // tainted
sink(ss); // tainted [NOT DETECTED]
sink(ss); // tainted
}
void test_string4()
@@ -155,5 +155,5 @@ void test_string4()
cs = ss.c_str();
sink(cs); // tainted [NOT DETECTED]
sink(ss); // tainted [NOT DETECTED]
sink(ss); // tainted
}

View File

@@ -90,6 +90,7 @@
| defaulttainttracking.cpp:88:18:88:23 | call to getenv | defaulttainttracking.cpp:88:8:88:32 | (reference dereference) |
| defaulttainttracking.cpp:88:18:88:23 | call to getenv | defaulttainttracking.cpp:88:18:88:23 | call to getenv |
| defaulttainttracking.cpp:88:18:88:23 | call to getenv | defaulttainttracking.cpp:88:18:88:30 | (reference to) |
| defaulttainttracking.cpp:88:18:88:23 | call to getenv | defaulttainttracking.cpp:88:18:88:30 | temporary object |
| defaulttainttracking.cpp:88:18:88:23 | call to getenv | shared.h:5:23:5:31 | sinkparam |
| defaulttainttracking.cpp:97:27:97:32 | call to getenv | defaulttainttracking.cpp:91:42:91:44 | arg |
| defaulttainttracking.cpp:97:27:97:32 | call to getenv | defaulttainttracking.cpp:92:12:92:14 | arg |
@@ -196,7 +197,9 @@
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:21:29:21:29 | s |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:43:78:43:104 | (unnamed parameter 0) |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:43:114:43:118 | (unnamed parameter 1) |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:44:176:44:178 | str |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:62:25:62:30 | call to getenv |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:63:30:63:30 | s |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:64:36:64:36 | s |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:68:8:68:8 | a |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:68:12:68:17 | call to source |
@@ -205,6 +208,11 @@
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:70:16:70:24 | call to basic_string |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:72:7:72:7 | (const char *)... |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:72:7:72:7 | a |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:74:7:74:7 | (const string)... |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:74:7:74:7 | (reference to) |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:74:7:74:7 | c |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:76:7:76:7 | (const basic_string<char, char_traits<char>, allocator<char>>)... |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:76:7:76:7 | c |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:82:16:82:21 | call to source |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:82:16:82:23 | (const char *)... |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:82:16:82:24 | call to basic_string |
@@ -223,40 +231,63 @@
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:87:9:87:16 | (const char *)... |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:87:18:87:18 | call to operator<< |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:87:18:87:26 | (reference dereference) |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:88:6:88:6 | call to operator<< |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:88:6:88:10 | (reference dereference) |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:88:9:88:9 | (const basic_string<char, char_traits<char>, allocator<char>>)... |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:88:9:88:9 | (reference to) |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:88:9:88:9 | t |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:91:7:91:9 | (const stringstream)... |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:91:7:91:9 | (reference to) |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:91:7:91:9 | ss2 |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:93:7:93:9 | (const stringstream)... |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:93:7:93:9 | (reference to) |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:93:7:93:9 | ss4 |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:94:7:94:9 | (const stringstream)... |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:94:7:94:9 | (reference to) |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:94:7:94:9 | ss5 |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:96:7:96:9 | (const basic_stringstream<char, char_traits<char>, allocator<char>>)... |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:96:7:96:9 | ss2 |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:98:7:98:9 | (const basic_stringstream<char, char_traits<char>, allocator<char>>)... |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:98:7:98:9 | ss4 |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:99:7:99:9 | (const basic_stringstream<char, char_traits<char>, allocator<char>>)... |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:99:7:99:9 | ss5 |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:118:10:118:15 | call to source |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:125:16:125:28 | call to basic_string |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:125:17:125:26 | call to user_input |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:125:17:125:28 | (const char *)... |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:126:7:126:11 | (const basic_string<char, char_traits<char>, allocator<char>>)... |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:126:7:126:11 | path1 |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:128:9:128:13 | path2 |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:129:10:129:19 | call to user_input |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:129:10:129:21 | (const char *)... |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:129:10:129:21 | call to basic_string |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:129:10:129:21 | temporary object |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:130:7:130:11 | (const basic_string<char, char_traits<char>, allocator<char>>)... |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:130:7:130:11 | path2 |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:132:15:132:24 | call to user_input |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:132:15:132:26 | (const char *)... |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:132:15:132:27 | call to basic_string |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:133:7:133:11 | (const basic_string<char, char_traits<char>, allocator<char>>)... |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:133:7:133:11 | path3 |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:138:14:138:15 | cs |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:138:19:138:24 | call to source |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:138:19:138:26 | (const char *)... |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:141:17:141:18 | cs |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:141:17:141:19 | call to basic_string |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:143:7:143:8 | cs |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:144:7:144:8 | (const string)... |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:144:7:144:8 | (reference to) |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:144:7:144:8 | ss |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:149:14:149:15 | cs |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:149:19:149:24 | call to source |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:149:19:149:26 | (const char *)... |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:152:17:152:18 | cs |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:152:17:152:19 | call to basic_string |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:155:7:155:8 | (const basic_string<char, char_traits<char>, allocator<char>>)... |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:155:7:155:8 | ss |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:158:7:158:8 | (const string)... |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:158:7:158:8 | (reference to) |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:158:7:158:8 | ss |
| test_diff.cpp:92:10:92:13 | argv | shared.h:5:23:5:31 | sinkparam |
| test_diff.cpp:92:10:92:13 | argv | test_diff.cpp:92:10:92:13 | argv |
| test_diff.cpp:92:10:92:13 | argv | test_diff.cpp:92:10:92:16 | (const char *)... |

View File

@@ -12,6 +12,7 @@
| defaulttainttracking.cpp:88:18:88:23 | call to getenv | defaulttainttracking.cpp:88:8:88:32 | (const char *)... | IR only |
| defaulttainttracking.cpp:88:18:88:23 | call to getenv | defaulttainttracking.cpp:88:8:88:32 | (reference dereference) | IR only |
| defaulttainttracking.cpp:88:18:88:23 | call to getenv | defaulttainttracking.cpp:88:18:88:30 | (reference to) | IR only |
| defaulttainttracking.cpp:88:18:88:23 | call to getenv | defaulttainttracking.cpp:88:18:88:30 | temporary object | IR only |
| defaulttainttracking.cpp:88:18:88:23 | call to getenv | shared.h:5:23:5:31 | sinkparam | IR only |
| defaulttainttracking.cpp:97:27:97:32 | call to getenv | defaulttainttracking.cpp:91:31:91:33 | ret | AST only |
| defaulttainttracking.cpp:97:27:97:32 | call to getenv | defaulttainttracking.cpp:92:5:92:8 | * ... | AST only |
@@ -83,9 +84,16 @@
| globals.cpp:13:15:13:20 | call to getenv | globals.cpp:13:5:13:11 | global1 | AST only |
| globals.cpp:23:15:23:20 | call to getenv | globals.cpp:23:5:23:11 | global2 | AST only |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:43:78:43:104 | (unnamed parameter 0) | IR only |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:44:176:44:178 | str | IR only |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:62:7:62:12 | source | AST only |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:63:30:63:30 | s | IR only |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:64:36:64:36 | s | IR only |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:70:16:70:24 | call to basic_string | IR only |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:74:7:74:7 | (const string)... | IR only |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:74:7:74:7 | (reference to) | IR only |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:74:7:74:7 | c | IR only |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:76:7:76:7 | (const basic_string<char, char_traits<char>, allocator<char>>)... | IR only |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:76:7:76:7 | c | IR only |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:82:16:82:24 | call to basic_string | IR only |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:85:6:85:6 | call to operator<< | IR only |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:85:6:85:17 | (reference dereference) | IR only |
@@ -97,26 +105,49 @@
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:87:9:87:16 | (const char *)... | IR only |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:87:18:87:18 | call to operator<< | IR only |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:87:18:87:26 | (reference dereference) | IR only |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:88:6:88:6 | call to operator<< | IR only |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:88:6:88:10 | (reference dereference) | IR only |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:88:9:88:9 | (const basic_string<char, char_traits<char>, allocator<char>>)... | IR only |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:88:9:88:9 | (reference to) | IR only |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:88:9:88:9 | t | IR only |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:91:7:91:9 | (const stringstream)... | IR only |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:91:7:91:9 | (reference to) | IR only |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:91:7:91:9 | ss2 | IR only |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:93:7:93:9 | (const stringstream)... | IR only |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:93:7:93:9 | (reference to) | IR only |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:93:7:93:9 | ss4 | IR only |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:94:7:94:9 | (const stringstream)... | IR only |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:94:7:94:9 | (reference to) | IR only |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:94:7:94:9 | ss5 | IR only |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:96:7:96:9 | (const basic_stringstream<char, char_traits<char>, allocator<char>>)... | IR only |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:96:7:96:9 | ss2 | IR only |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:98:7:98:9 | (const basic_stringstream<char, char_traits<char>, allocator<char>>)... | IR only |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:98:7:98:9 | ss4 | IR only |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:99:7:99:9 | (const basic_stringstream<char, char_traits<char>, allocator<char>>)... | IR only |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:99:7:99:9 | ss5 | IR only |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:117:7:117:16 | user_input | AST only |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:125:16:125:28 | call to basic_string | IR only |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:126:7:126:11 | (const basic_string<char, char_traits<char>, allocator<char>>)... | IR only |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:126:7:126:11 | path1 | IR only |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:128:9:128:13 | path2 | IR only |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:129:10:129:21 | call to basic_string | IR only |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:129:10:129:21 | temporary object | IR only |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:130:7:130:11 | (const basic_string<char, char_traits<char>, allocator<char>>)... | IR only |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:130:7:130:11 | path2 | IR only |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:132:15:132:27 | call to basic_string | IR only |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:133:7:133:11 | (const basic_string<char, char_traits<char>, allocator<char>>)... | IR only |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:133:7:133:11 | path3 | IR only |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:141:17:141:19 | call to basic_string | IR only |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:144:7:144:8 | (const string)... | IR only |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:144:7:144:8 | (reference to) | IR only |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:144:7:144:8 | ss | IR only |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:152:17:152:19 | call to basic_string | IR only |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:155:7:155:8 | (const basic_string<char, char_traits<char>, allocator<char>>)... | IR only |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:155:7:155:8 | ss | IR only |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:157:7:157:8 | cs | AST only |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:158:7:158:8 | (const string)... | IR only |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:158:7:158:8 | (reference to) | IR only |
| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:158:7:158:8 | ss | IR only |
| test_diff.cpp:104:12:104:15 | argv | test_diff.cpp:104:11:104:20 | (...) | IR only |
| test_diff.cpp:108:10:108:13 | argv | test_diff.cpp:36:24:36:24 | p | AST only |
| test_diff.cpp:111:10:111:13 | argv | shared.h:5:23:5:31 | sinkparam | AST only |

View File

@@ -1,6 +1,6 @@
int source();
void sink(...) {};
void sink(...);
class MyCopyableClass {
public:

View File

@@ -1,6 +1,6 @@
int source();
void sink(...) {};
void sink(...);
class MyCopyableClassDeclOnly {
public:
@@ -15,7 +15,7 @@ public:
int v;
};
void test_copyableclass()
void test_copyableclass_declonly()
{
{
MyCopyableClassDeclOnly s1(1);

View File

@@ -30,7 +30,7 @@ int sscanf(const char *s, const char *format, ...);
// ----------
int source();
void sink(...) {};
void sink(...);
namespace string
{

View File

@@ -262,6 +262,10 @@
| file://:0:0:0:0 | (unnamed parameter 0) | file://:0:0:0:0 | (unnamed parameter 0) | |
| file://:0:0:0:0 | (unnamed parameter 0) | file://:0:0:0:0 | (unnamed parameter 0) | |
| file://:0:0:0:0 | (unnamed parameter 0) | file://:0:0:0:0 | (unnamed parameter 0) | |
| file://:0:0:0:0 | (unnamed parameter 0) | file://:0:0:0:0 | (unnamed parameter 0) | |
| file://:0:0:0:0 | (unnamed parameter 0) | file://:0:0:0:0 | (unnamed parameter 0) | |
| file://:0:0:0:0 | (unnamed parameter 0) | file://:0:0:0:0 | (unnamed parameter 0) | |
| file://:0:0:0:0 | (unnamed parameter 0) | file://:0:0:0:0 | (unnamed parameter 0) | |
| format.cpp:16:21:16:21 | s | format.cpp:22:22:22:22 | s | |
| format.cpp:16:31:16:31 | n | format.cpp:22:25:22:25 | n | |
| format.cpp:16:46:16:51 | format | format.cpp:22:28:22:33 | format | |
@@ -2062,8 +2066,8 @@
| movableclass.cpp:15:3:15:13 | ... = ... | movableclass.cpp:15:9:15:9 | v [post update] | |
| movableclass.cpp:15:13:15:13 | 0 | movableclass.cpp:15:3:15:13 | ... = ... | |
| movableclass.cpp:16:11:16:14 | this | movableclass.cpp:16:10:16:14 | * ... | TAINT |
| movableclass.cpp:22:57:22:57 | 1 | movableclass.cpp:22:42:22:58 | call to MyMovableClass | TAINT |
| movableclass.cpp:23:55:23:60 | call to source | movableclass.cpp:23:40:23:63 | call to MyMovableClass | TAINT |
| movableclass.cpp:22:57:22:57 | 1 | movableclass.cpp:22:35:22:59 | call to MyMovableClass | TAINT |
| movableclass.cpp:23:55:23:60 | call to source | movableclass.cpp:23:33:23:64 | call to MyMovableClass | TAINT |
| movableclass.cpp:28:21:28:21 | 1 | movableclass.cpp:28:21:28:22 | call to MyMovableClass | TAINT |
| movableclass.cpp:28:21:28:22 | call to MyMovableClass | movableclass.cpp:33:8:33:9 | s1 | |
| movableclass.cpp:29:22:29:23 | call to MyMovableClass | movableclass.cpp:34:8:34:9 | s2 | |
@@ -2092,10 +2096,8 @@
| movableclass.cpp:52:8:52:31 | call to MyMovableClass | movableclass.cpp:52:3:52:4 | ref arg s2 | TAINT |
| movableclass.cpp:52:8:52:31 | call to MyMovableClass | movableclass.cpp:52:6:52:6 | call to operator= | TAINT |
| movableclass.cpp:52:23:52:28 | call to source | movableclass.cpp:52:8:52:31 | call to MyMovableClass | TAINT |
| movableclass.cpp:59:21:59:32 | call to getUnTainted | movableclass.cpp:59:21:59:35 | call to MyMovableClass | |
| movableclass.cpp:59:21:59:35 | call to MyMovableClass | movableclass.cpp:63:8:63:9 | s1 | |
| movableclass.cpp:60:21:60:30 | call to getTainted | movableclass.cpp:60:21:60:33 | call to MyMovableClass | |
| movableclass.cpp:60:21:60:33 | call to MyMovableClass | movableclass.cpp:64:8:64:9 | s2 | |
| movableclass.cpp:59:21:59:32 | call to getUnTainted | movableclass.cpp:63:8:63:9 | s1 | |
| movableclass.cpp:60:21:60:30 | call to getTainted | movableclass.cpp:64:8:64:9 | s2 | |
| movableclass.cpp:61:18:61:19 | call to MyMovableClass | movableclass.cpp:65:8:65:9 | s3 | |
| movableclass.cpp:65:13:65:18 | call to source | movableclass.cpp:65:13:65:20 | call to MyMovableClass | TAINT |
| movableclass.cpp:65:13:65:20 | call to MyMovableClass | movableclass.cpp:65:8:65:9 | ref arg s3 | TAINT |
@@ -3189,36 +3191,42 @@
| stl.h:292:30:292:40 | call to allocator | stl.h:292:21:292:41 | noexcept(...) | TAINT |
| stl.h:292:53:292:63 | 0 | stl.h:292:46:292:64 | (no string representation) | TAINT |
| stl.h:385:9:385:9 | Unknown literal | stl.h:385:9:385:9 | constructor init of field first | TAINT |
| stl.h:385:9:385:9 | Unknown literal | stl.h:385:9:385:9 | constructor init of field first | TAINT |
| stl.h:385:9:385:9 | Unknown literal | stl.h:385:9:385:9 | constructor init of field first | TAINT |
| stl.h:385:9:385:9 | Unknown literal | stl.h:385:9:385:9 | constructor init of field first | TAINT |
| stl.h:385:9:385:9 | Unknown literal | stl.h:385:9:385:9 | constructor init of field first | TAINT |
| stl.h:385:9:385:9 | Unknown literal | stl.h:385:9:385:9 | constructor init of field second | TAINT |
| stl.h:385:9:385:9 | Unknown literal | stl.h:385:9:385:9 | constructor init of field second | TAINT |
| stl.h:385:9:385:9 | Unknown literal | stl.h:385:9:385:9 | constructor init of field second | TAINT |
| stl.h:385:9:385:9 | Unknown literal | stl.h:385:9:385:9 | constructor init of field second | TAINT |
| stl.h:385:9:385:9 | Unknown literal | stl.h:385:9:385:9 | constructor init of field second | TAINT |
| stl.h:385:9:385:9 | constructor init of field first [post-this] | stl.h:385:9:385:9 | constructor init of field second [pre-this] | |
| stl.h:385:9:385:9 | constructor init of field first [post-this] | stl.h:385:9:385:9 | constructor init of field second [pre-this] | |
| stl.h:385:9:385:9 | constructor init of field first [post-this] | stl.h:385:9:385:9 | constructor init of field second [pre-this] | |
| stl.h:385:9:385:9 | constructor init of field first [post-this] | stl.h:385:9:385:9 | constructor init of field second [pre-this] | |
| stl.h:385:9:385:9 | constructor init of field first [post-this] | stl.h:385:9:385:9 | constructor init of field second [pre-this] | |
| stl.h:385:9:385:9 | constructor init of field first [pre-this] | stl.h:385:9:385:9 | constructor init of field second [pre-this] | |
| stl.h:385:9:385:9 | constructor init of field first [pre-this] | stl.h:385:9:385:9 | constructor init of field second [pre-this] | |
| stl.h:385:9:385:9 | constructor init of field first [pre-this] | stl.h:385:9:385:9 | constructor init of field second [pre-this] | |
| stl.h:385:9:385:9 | constructor init of field first [pre-this] | stl.h:385:9:385:9 | constructor init of field second [pre-this] | |
| stl.h:385:9:385:9 | constructor init of field first [pre-this] | stl.h:385:9:385:9 | constructor init of field second [pre-this] | |
| stl.h:385:9:385:9 | this | stl.h:385:9:385:9 | constructor init of field first [pre-this] | |
| stl.h:385:9:385:9 | this | stl.h:385:9:385:9 | constructor init of field first [pre-this] | |
| stl.h:385:9:385:9 | this | stl.h:385:9:385:9 | constructor init of field first [pre-this] | |
| stl.h:385:9:385:9 | this | stl.h:385:9:385:9 | constructor init of field first [pre-this] | |
| stl.h:385:9:385:9 | this | stl.h:385:9:385:9 | constructor init of field first [pre-this] | |
| stl.h:392:3:392:3 | this | stl.h:392:36:392:43 | constructor init of field first [pre-this] | |
| stl.h:392:3:392:3 | this | stl.h:392:36:392:43 | constructor init of field first [pre-this] | |
| stl.h:392:3:392:3 | this | stl.h:392:36:392:43 | constructor init of field first [pre-this] | |
| stl.h:392:3:392:3 | this | stl.h:392:36:392:43 | constructor init of field first [pre-this] | |
| stl.h:392:3:392:3 | this | stl.h:392:36:392:43 | constructor init of field first [pre-this] | |
| stl.h:392:3:392:3 | this | stl.h:392:36:392:43 | constructor init of field first [pre-this] | |
| stl.h:392:3:392:3 | this | stl.h:392:36:392:43 | constructor init of field first [pre-this] | |
| stl.h:392:3:392:6 | this | stl.h:392:36:392:43 | constructor init of field first [pre-this] | |
| stl.h:392:18:392:18 | x | stl.h:392:18:392:18 | x | |
| stl.h:392:18:392:18 | x | stl.h:392:18:392:18 | x | |
| stl.h:392:18:392:18 | x | stl.h:392:18:392:18 | x | |
| stl.h:392:18:392:18 | x | stl.h:392:18:392:18 | x | |
| stl.h:392:18:392:18 | x | stl.h:392:42:392:42 | x | |
| stl.h:392:18:392:18 | x | stl.h:392:42:392:42 | x | |
| stl.h:392:18:392:18 | x | stl.h:392:42:392:42 | x | |
| stl.h:392:18:392:18 | x | stl.h:392:42:392:42 | x | |
| stl.h:392:18:392:18 | x | stl.h:392:42:392:42 | x | |
| stl.h:392:18:392:18 | x | stl.h:392:42:392:42 | x | |
| stl.h:392:18:392:18 | x | stl.h:392:42:392:42 | x | |
| stl.h:392:18:392:18 | x | stl.h:392:42:392:42 | x | |
| stl.h:392:31:392:31 | y | stl.h:392:31:392:31 | y | |
| stl.h:392:31:392:31 | y | stl.h:392:31:392:31 | y | |
| stl.h:392:31:392:31 | y | stl.h:392:31:392:31 | y | |
| stl.h:392:31:392:31 | y | stl.h:392:31:392:31 | y | |
| stl.h:392:31:392:31 | y | stl.h:392:53:392:53 | y | |
| stl.h:392:31:392:31 | y | stl.h:392:53:392:53 | y | |
| stl.h:392:31:392:31 | y | stl.h:392:53:392:53 | y | |
| stl.h:392:31:392:31 | y | stl.h:392:53:392:53 | y | |
| stl.h:392:31:392:31 | y | stl.h:392:53:392:53 | y | |
@@ -3232,18 +3240,12 @@
| stl.h:392:36:392:43 | constructor init of field first [post-this] | stl.h:392:46:392:54 | constructor init of field second [pre-this] | |
| stl.h:392:36:392:43 | constructor init of field first [post-this] | stl.h:392:46:392:54 | constructor init of field second [pre-this] | |
| stl.h:392:36:392:43 | constructor init of field first [post-this] | stl.h:392:46:392:54 | constructor init of field second [pre-this] | |
| stl.h:392:36:392:43 | constructor init of field first [post-this] | stl.h:392:46:392:54 | constructor init of field second [pre-this] | |
| stl.h:392:36:392:43 | constructor init of field first [post-this] | stl.h:392:46:392:54 | constructor init of field second [pre-this] | |
| stl.h:392:36:392:43 | constructor init of field first [pre-this] | stl.h:392:46:392:54 | constructor init of field second [pre-this] | |
| stl.h:392:36:392:43 | constructor init of field first [pre-this] | stl.h:392:46:392:54 | constructor init of field second [pre-this] | |
| stl.h:392:36:392:43 | constructor init of field first [pre-this] | stl.h:392:46:392:54 | constructor init of field second [pre-this] | |
| stl.h:392:36:392:43 | constructor init of field first [pre-this] | stl.h:392:46:392:54 | constructor init of field second [pre-this] | |
| stl.h:392:36:392:43 | constructor init of field first [pre-this] | stl.h:392:46:392:54 | constructor init of field second [pre-this] | |
| stl.h:392:36:392:43 | constructor init of field first [pre-this] | stl.h:392:46:392:54 | constructor init of field second [pre-this] | |
| stl.h:392:36:392:43 | constructor init of field first [pre-this] | stl.h:392:46:392:54 | constructor init of field second [pre-this] | |
| stl.h:392:36:392:43 | constructor init of field first [pre-this] | stl.h:392:46:392:54 | constructor init of field second [pre-this] | |
| stl.h:392:42:392:42 | x | stl.h:392:36:392:43 | constructor init of field first | TAINT |
| stl.h:392:42:392:42 | x | stl.h:392:36:392:43 | constructor init of field first | TAINT |
| stl.h:392:42:392:42 | x | stl.h:392:36:392:43 | constructor init of field first | TAINT |
| stl.h:392:42:392:42 | x | stl.h:392:36:392:43 | constructor init of field first | TAINT |
| stl.h:392:42:392:42 | x | stl.h:392:36:392:43 | constructor init of field first | TAINT |
@@ -3255,74 +3257,58 @@
| stl.h:392:53:392:53 | y | stl.h:392:46:392:54 | constructor init of field second | TAINT |
| stl.h:392:53:392:53 | y | stl.h:392:46:392:54 | constructor init of field second | TAINT |
| stl.h:392:53:392:53 | y | stl.h:392:46:392:54 | constructor init of field second | TAINT |
| stl.h:392:53:392:53 | y | stl.h:392:46:392:54 | constructor init of field second | TAINT |
| stl.h:392:53:392:53 | y | stl.h:392:46:392:54 | constructor init of field second | TAINT |
| stl.h:398:109:398:109 | x | stl.h:398:109:398:109 | x | |
| stl.h:398:109:398:109 | x | stl.h:398:109:398:109 | x | |
| stl.h:398:109:398:109 | x | stl.h:398:109:398:109 | x | |
| stl.h:398:109:398:109 | x | stl.h:398:109:398:109 | x | |
| stl.h:398:109:398:109 | x | stl.h:398:109:398:109 | x | |
| stl.h:398:109:398:109 | x | stl.h:398:109:398:109 | x | |
| stl.h:398:109:398:109 | x | stl.h:398:109:398:109 | x | |
| stl.h:398:109:398:109 | x | stl.h:399:40:399:40 | x | |
| stl.h:398:109:398:109 | x | stl.h:399:40:399:40 | x | |
| stl.h:398:109:398:109 | x | stl.h:399:40:399:40 | x | |
| stl.h:398:109:398:109 | x | stl.h:399:40:399:40 | x | |
| stl.h:398:109:398:109 | x | stl.h:399:40:399:40 | x | |
| stl.h:398:109:398:109 | x | stl.h:399:40:399:40 | x | |
| stl.h:398:109:398:109 | x | stl.h:399:40:399:40 | x | |
| stl.h:398:117:398:117 | y | stl.h:398:117:398:117 | y | |
| stl.h:398:117:398:117 | y | stl.h:398:117:398:117 | y | |
| stl.h:398:117:398:117 | y | stl.h:398:117:398:117 | y | |
| stl.h:398:117:398:117 | y | stl.h:398:117:398:117 | y | |
| stl.h:398:117:398:117 | y | stl.h:398:117:398:117 | y | |
| stl.h:398:117:398:117 | y | stl.h:398:117:398:117 | y | |
| stl.h:398:117:398:117 | y | stl.h:398:117:398:117 | y | |
| stl.h:398:117:398:117 | y | stl.h:399:61:399:61 | y | |
| stl.h:398:117:398:117 | y | stl.h:399:61:399:61 | y | |
| stl.h:398:117:398:117 | y | stl.h:399:61:399:61 | y | |
| stl.h:398:117:398:117 | y | stl.h:399:61:399:61 | y | |
| stl.h:398:117:398:117 | y | stl.h:399:61:399:61 | y | |
| stl.h:398:117:398:117 | y | stl.h:399:61:399:61 | y | |
| stl.h:398:117:398:117 | y | stl.h:399:61:399:61 | y | |
| stl.h:399:10:399:63 | call to pair | stl.h:399:10:399:63 | call to pair | TAINT |
| stl.h:399:10:399:63 | call to pair | stl.h:399:10:399:63 | call to pair | TAINT |
| stl.h:399:10:399:63 | call to pair | stl.h:399:10:399:63 | call to pair | TAINT |
| stl.h:399:10:399:63 | call to pair | stl.h:399:10:399:63 | call to pair | TAINT |
| stl.h:399:10:399:63 | call to pair | stl.h:399:10:399:63 | call to pair | TAINT |
| stl.h:399:10:399:63 | call to pair | stl.h:399:10:399:63 | call to pair | TAINT |
| stl.h:399:23:399:38 | ref arg call to forward | stl.h:398:109:398:109 | x | |
| stl.h:399:23:399:38 | ref arg call to forward | stl.h:398:109:398:109 | x | |
| stl.h:399:23:399:38 | ref arg call to forward | stl.h:398:109:398:109 | x | |
| stl.h:399:23:399:38 | ref arg call to forward | stl.h:398:109:398:109 | x | |
| stl.h:399:23:399:38 | ref arg call to forward | stl.h:399:40:399:40 | x [inner post update] | |
| stl.h:399:23:399:38 | ref arg call to forward | stl.h:399:40:399:40 | x [inner post update] | |
| stl.h:399:23:399:38 | ref arg call to forward | stl.h:399:40:399:40 | x [inner post update] | |
| stl.h:399:23:399:38 | ref arg call to forward | stl.h:399:40:399:40 | x [inner post update] | |
| stl.h:399:40:399:40 | x | stl.h:399:23:399:38 | call to forward | |
| stl.h:399:40:399:40 | x | stl.h:399:23:399:38 | call to forward | |
| stl.h:399:40:399:40 | x | stl.h:399:23:399:38 | call to forward | |
| stl.h:399:40:399:40 | x | stl.h:399:23:399:38 | call to forward | |
| stl.h:399:40:399:40 | x | stl.h:399:23:399:38 | call to forward | |
| stl.h:399:40:399:40 | x | stl.h:399:23:399:38 | call to forward | |
| stl.h:399:44:399:59 | call to forward | stl.h:399:10:399:63 | call to pair | TAINT |
| stl.h:399:44:399:59 | call to forward | stl.h:399:10:399:63 | call to pair | TAINT |
| stl.h:399:44:399:59 | ref arg call to forward | stl.h:398:117:398:117 | y | |
| stl.h:399:44:399:59 | ref arg call to forward | stl.h:398:117:398:117 | y | |
| stl.h:399:44:399:59 | ref arg call to forward | stl.h:398:117:398:117 | y | |
| stl.h:399:44:399:59 | ref arg call to forward | stl.h:398:117:398:117 | y | |
| stl.h:399:44:399:59 | ref arg call to forward | stl.h:399:61:399:61 | y [inner post update] | |
| stl.h:399:44:399:59 | ref arg call to forward | stl.h:399:61:399:61 | y [inner post update] | |
| stl.h:399:44:399:59 | ref arg call to forward | stl.h:399:61:399:61 | y [inner post update] | |
| stl.h:399:44:399:59 | ref arg call to forward | stl.h:399:61:399:61 | y [inner post update] | |
| stl.h:399:61:399:61 | y | stl.h:399:10:399:63 | call to pair | TAINT |
| stl.h:399:61:399:61 | y | stl.h:399:10:399:63 | call to pair | TAINT |
| stl.h:399:61:399:61 | y | stl.h:399:44:399:59 | call to forward | |
| stl.h:399:61:399:61 | y | stl.h:399:44:399:59 | call to forward | |
| stl.h:399:61:399:61 | y | stl.h:399:44:399:59 | call to forward | |
| stl.h:399:61:399:61 | y | stl.h:399:44:399:59 | call to forward | |
| stl.h:399:61:399:61 | y | stl.h:399:44:399:59 | call to forward | |
| stl.h:399:61:399:61 | y | stl.h:399:44:399:59 | call to forward | |
| stl.h:398:87:398:87 | x | stl.h:398:87:398:87 | x | |
| stl.h:398:87:398:87 | x | stl.h:398:87:398:87 | x | |
| stl.h:398:87:398:87 | x | stl.h:398:87:398:87 | x | |
| stl.h:398:87:398:87 | x | stl.h:398:87:398:87 | x | |
| stl.h:398:87:398:87 | x | stl.h:398:87:398:87 | x | |
| stl.h:398:87:398:87 | x | stl.h:398:87:398:87 | x | |
| stl.h:398:87:398:87 | x | stl.h:398:87:398:87 | x | |
| stl.h:398:87:398:87 | x | stl.h:399:58:399:58 | x | |
| stl.h:398:87:398:87 | x | stl.h:399:58:399:58 | x | |
| stl.h:398:87:398:87 | x | stl.h:399:58:399:58 | x | |
| stl.h:398:87:398:87 | x | stl.h:399:58:399:58 | x | |
| stl.h:398:87:398:87 | x | stl.h:399:58:399:58 | x | |
| stl.h:398:87:398:87 | x | stl.h:399:58:399:58 | x | |
| stl.h:398:87:398:87 | x | stl.h:399:58:399:58 | x | |
| stl.h:398:95:398:95 | y | stl.h:398:95:398:95 | y | |
| stl.h:398:95:398:95 | y | stl.h:398:95:398:95 | y | |
| stl.h:398:95:398:95 | y | stl.h:398:95:398:95 | y | |
| stl.h:398:95:398:95 | y | stl.h:398:95:398:95 | y | |
| stl.h:398:95:398:95 | y | stl.h:398:95:398:95 | y | |
| stl.h:398:95:398:95 | y | stl.h:398:95:398:95 | y | |
| stl.h:398:95:398:95 | y | stl.h:398:95:398:95 | y | |
| stl.h:398:95:398:95 | y | stl.h:399:79:399:79 | y | |
| stl.h:398:95:398:95 | y | stl.h:399:79:399:79 | y | |
| stl.h:398:95:398:95 | y | stl.h:399:79:399:79 | y | |
| stl.h:398:95:398:95 | y | stl.h:399:79:399:79 | y | |
| stl.h:398:95:398:95 | y | stl.h:399:79:399:79 | y | |
| stl.h:398:95:398:95 | y | stl.h:399:79:399:79 | y | |
| stl.h:398:95:398:95 | y | stl.h:399:79:399:79 | y | |
| stl.h:399:58:399:58 | x | stl.h:399:41:399:56 | call to forward | |
| stl.h:399:58:399:58 | x | stl.h:399:41:399:56 | call to forward | |
| stl.h:399:58:399:58 | x | stl.h:399:41:399:56 | call to forward | |
| stl.h:399:58:399:58 | x | stl.h:399:41:399:56 | call to forward | |
| stl.h:399:58:399:58 | x | stl.h:399:41:399:56 | call to forward | |
| stl.h:399:58:399:58 | x | stl.h:399:41:399:56 | call to forward | |
| stl.h:399:62:399:77 | call to forward | stl.h:399:3:399:82 | call to pair | TAINT |
| stl.h:399:62:399:77 | call to forward | stl.h:399:3:399:82 | call to pair | TAINT |
| stl.h:399:62:399:77 | call to forward | stl.h:399:3:399:82 | call to pair | TAINT |
| stl.h:399:62:399:77 | call to forward | stl.h:399:3:399:82 | call to pair | TAINT |
| stl.h:399:62:399:77 | call to forward | stl.h:399:3:399:82 | call to pair | TAINT |
| stl.h:399:62:399:77 | call to forward | stl.h:399:3:399:82 | call to pair | TAINT |
| stl.h:399:79:399:79 | y | stl.h:399:3:399:82 | call to pair | TAINT |
| stl.h:399:79:399:79 | y | stl.h:399:3:399:82 | call to pair | TAINT |
| stl.h:399:79:399:79 | y | stl.h:399:3:399:82 | call to pair | TAINT |
| stl.h:399:79:399:79 | y | stl.h:399:3:399:82 | call to pair | TAINT |
| stl.h:399:79:399:79 | y | stl.h:399:3:399:82 | call to pair | TAINT |
| stl.h:399:79:399:79 | y | stl.h:399:3:399:82 | call to pair | TAINT |
| stl.h:399:79:399:79 | y | stl.h:399:62:399:77 | call to forward | |
| stl.h:399:79:399:79 | y | stl.h:399:62:399:77 | call to forward | |
| stl.h:399:79:399:79 | y | stl.h:399:62:399:77 | call to forward | |
| stl.h:399:79:399:79 | y | stl.h:399:62:399:77 | call to forward | |
| stl.h:399:79:399:79 | y | stl.h:399:62:399:77 | call to forward | |
| stl.h:399:79:399:79 | y | stl.h:399:62:399:77 | call to forward | |
| string.cpp:25:12:25:17 | call to source | string.cpp:29:7:29:7 | a | |
| string.cpp:26:16:26:20 | 123 | string.cpp:26:16:26:21 | call to basic_string | TAINT |
| string.cpp:26:16:26:21 | call to basic_string | string.cpp:30:7:30:7 | b | |
@@ -5060,16 +5046,10 @@
| swap1.cpp:56:30:56:34 | data1 | swap1.cpp:56:18:56:22 | ref arg data1 | |
| swap1.cpp:61:22:61:22 | x | swap1.cpp:61:22:61:22 | x | |
| swap1.cpp:61:22:61:22 | x | swap1.cpp:63:9:63:9 | x | |
| swap1.cpp:61:22:61:22 | x | swap2.cpp:61:22:61:22 | x | |
| swap1.cpp:61:22:61:22 | x | swap2.cpp:63:9:63:9 | x | |
| swap1.cpp:61:32:61:32 | y | swap1.cpp:61:32:61:32 | y | |
| swap1.cpp:61:32:61:32 | y | swap1.cpp:63:16:63:16 | y | |
| swap1.cpp:61:32:61:32 | y | swap2.cpp:61:32:61:32 | y | |
| swap1.cpp:61:32:61:32 | y | swap2.cpp:63:16:63:16 | y | |
| swap1.cpp:63:9:63:9 | ref arg x | swap1.cpp:61:22:61:22 | x | |
| swap1.cpp:63:9:63:9 | ref arg x | swap2.cpp:61:22:61:22 | x | |
| swap1.cpp:63:16:63:16 | ref arg y | swap1.cpp:61:32:61:32 | y | |
| swap1.cpp:63:16:63:16 | ref arg y | swap2.cpp:61:32:61:32 | y | |
| swap1.cpp:69:23:69:23 | x | swap1.cpp:71:5:71:5 | x | |
| swap1.cpp:69:23:69:23 | x | swap1.cpp:73:10:73:10 | x | |
| swap1.cpp:69:23:69:23 | x | swap1.cpp:76:9:76:9 | x | |
@@ -5230,17 +5210,11 @@
| swap2.cpp:56:50:56:53 | that | swap2.cpp:56:43:56:47 | ref arg data2 | |
| swap2.cpp:56:50:56:53 | that [post update] | swap2.cpp:53:26:53:29 | that | |
| swap2.cpp:56:55:56:59 | data2 | swap2.cpp:56:43:56:47 | ref arg data2 | |
| swap2.cpp:61:22:61:22 | x | swap1.cpp:61:22:61:22 | x | |
| swap2.cpp:61:22:61:22 | x | swap1.cpp:63:9:63:9 | x | |
| swap2.cpp:61:22:61:22 | x | swap2.cpp:61:22:61:22 | x | |
| swap2.cpp:61:22:61:22 | x | swap2.cpp:63:9:63:9 | x | |
| swap2.cpp:61:32:61:32 | y | swap1.cpp:61:32:61:32 | y | |
| swap2.cpp:61:32:61:32 | y | swap1.cpp:63:16:63:16 | y | |
| swap2.cpp:61:32:61:32 | y | swap2.cpp:61:32:61:32 | y | |
| swap2.cpp:61:32:61:32 | y | swap2.cpp:63:16:63:16 | y | |
| swap2.cpp:63:9:63:9 | ref arg x | swap1.cpp:61:22:61:22 | x | |
| swap2.cpp:63:9:63:9 | ref arg x | swap2.cpp:61:22:61:22 | x | |
| swap2.cpp:63:16:63:16 | ref arg y | swap1.cpp:61:32:61:32 | y | |
| swap2.cpp:63:16:63:16 | ref arg y | swap2.cpp:61:32:61:32 | y | |
| swap2.cpp:69:23:69:23 | x | swap2.cpp:71:5:71:5 | x | |
| swap2.cpp:69:23:69:23 | x | swap2.cpp:73:10:73:10 | x | |

View File

@@ -2,9 +2,9 @@
#include "stl.h"
using namespace std;
namespace {
char *source();
}
void sink(char *);
void sink(const char *);
void sink(bool);
@@ -84,10 +84,10 @@ void test_pair()
sink(make_pair("123", "456").first);
sink(make_pair("123", "456").second);
sink(make_pair(source(), "456")); // tainted [NOT DETECTED]
sink(make_pair(source(), "456").first); // tainted [NOT DETECTED]
sink(make_pair(source(), "456").first); // tainted
sink(make_pair(source(), "456").second);
sink(make_pair("123", source())); // tainted
sink(make_pair("123", source()).first); // [FALSE POSITIVE]
sink(make_pair("123", source()).first);
sink(make_pair("123", source()).second); // tainted
std::pair<std::pair<char *, char *>, char *> m;

View File

@@ -19,10 +19,10 @@ public:
int v;
};
MyMovableClass &&getUnTainted() { return MyMovableClass(1); }
MyMovableClass &&getTainted() { return MyMovableClass(source()); }
MyMovableClass getUnTainted() { return MyMovableClass(1); }
MyMovableClass getTainted() { return MyMovableClass(source()); }
void test_copyableclass()
void test_movableclass()
{
{
MyMovableClass s1(1);

View File

@@ -2,9 +2,9 @@
#include "stl.h"
using namespace std;
namespace {
char *source();
}
void sink(char *);
void sink(std::set<char *>);
void sink(std::set<char *>::iterator);

View File

@@ -1,28 +1,28 @@
typedef unsigned long size_t;
template<class T>
struct remove_const { typedef T type; };
template<class T>
struct remove_const<const T> { typedef T type; };
// `remove_const_t<T>` removes any `const` specifier from `T`
template<class T>
using remove_const_t = typename remove_const<T>::type;
template<class T>
struct remove_reference { typedef T type; };
template<class T>
struct remove_reference<T &> { typedef T type; };
template<class T>
struct remove_reference<T &&> { typedef T type; };
// `remove_reference_t<T>` removes any `&` from `T`
template<class T>
using remove_reference_t = typename remove_reference<T>::type;
#include "type_traits.h"
namespace std
{
@@ -395,8 +395,8 @@ namespace std {
void swap(pair& p) /*noexcept(...)*/;
};
template<class T1, class T2> constexpr pair<remove_reference_t<T1>, remove_reference_t<T2>> make_pair(T1&& x, T2&& y) {
return pair<T1, T2>(std::forward<T1>(x), std::forward<T2>(y));
template<class T1, class T2> constexpr pair<decay_t<T1>, decay_t<T2>> make_pair(T1&& x, T2&& y) {
return pair<decay_t<T1>, decay_t<T2>>(std::forward<T1>(x), std::forward<T2>(y));
}
}

View File

@@ -2,9 +2,9 @@
#include "stl.h"
using namespace std;
namespace {
char *source();
}
namespace ns_char
{
char source();
@@ -499,7 +499,7 @@ void test_string_iterator_methods()
}
}
void test_constructors_more() {
void test_string_constructors_more() {
char *cs1 = "abc";
char *cs2 = source();
std::string s1(cs1);

View File

@@ -2,9 +2,9 @@
#include "stl.h"
using namespace std;
namespace {
char *source();
}
namespace ns_char
{
char source();

View File

@@ -1,6 +1,6 @@
int source();
void sink(...) {};
void sink(...);
class StructLikeClass {
public:

View File

@@ -13,7 +13,7 @@ namespace std
template <class T>
T &&move(T &t) noexcept { return static_cast<T &&>(t); } // simplified signature (and implementation)
} // namespace std
namespace Swap1 {
namespace IntWrapper
{
struct Class
@@ -84,7 +84,7 @@ void test_copy_assignment_operator()
swap(z1, z2);
sink(z2.data1); // tainted [FALSE NEGATIVE in IR]
sink(z2.data1); // tainted
sink(z1.data1); // clean [FALSE POSITIVE]
}
@@ -144,3 +144,5 @@ void test_move_assignment_method()
sink(y.data1); // tainted
sink(x.data1); // tainted
}
}

View File

@@ -13,7 +13,7 @@ namespace std
template <class T>
T &&move(T &t) noexcept { return static_cast<T &&>(t); } // simplified signature (and implementation)
} // namespace std
namespace Swap2 {
namespace IntWrapper
{
struct Class
@@ -84,7 +84,7 @@ void test_copy_assignment_operator()
swap(z1, z2);
sink(z2.data1); // tainted [FALSE NEGATIVE in IR]
sink(z2.data1); // tainted
sink(z1.data1); // clean [FALSE POSITIVE]
}
@@ -144,3 +144,5 @@ void test_move_assignment_method()
sink(y.data1); // tainted
sink(x.data1); // tainted
}
}

View File

@@ -1,5 +1,5 @@
int source();
void sink(...) {};
void sink(...);
void arithAssignments(int source1, int clean1) {
sink(clean1); // clean

View File

@@ -48,7 +48,9 @@
| map.cpp:77:9:77:14 | second | map.cpp:66:37:66:42 | call to source |
| map.cpp:78:7:78:7 | k | map.cpp:66:37:66:42 | call to source |
| map.cpp:81:7:81:7 | l | map.cpp:66:37:66:42 | call to source |
| map.cpp:87:34:87:38 | first | map.cpp:87:17:87:22 | call to source |
| map.cpp:89:7:89:32 | call to pair | map.cpp:89:24:89:29 | call to source |
| map.cpp:91:34:91:39 | second | map.cpp:91:24:91:29 | call to source |
| map.cpp:110:10:110:15 | call to insert | map.cpp:110:62:110:67 | call to source |
| map.cpp:112:10:112:25 | call to insert_or_assign | map.cpp:112:46:112:51 | call to source |
| map.cpp:114:7:114:8 | call to map | map.cpp:108:39:108:44 | call to source |

View File

@@ -15,7 +15,6 @@
| arrayassignment.cpp:146:7:146:13 | arrayassignment.cpp:144:12:144:17 | IR only |
| copyableclass.cpp:67:11:67:11 | copyableclass.cpp:67:13:67:18 | AST only |
| copyableclass.cpp:67:11:67:21 | copyableclass.cpp:67:13:67:18 | IR only |
| copyableclass_declonly.cpp:42:8:42:9 | copyableclass_declonly.cpp:34:30:34:35 | AST only |
| copyableclass_declonly.cpp:67:11:67:11 | copyableclass_declonly.cpp:67:13:67:18 | AST only |
| map.cpp:49:9:49:13 | map.cpp:48:37:48:42 | IR only |
| map.cpp:54:9:54:13 | map.cpp:48:37:48:42 | IR only |
@@ -27,22 +26,8 @@
| map.cpp:79:9:79:13 | map.cpp:66:37:66:42 | IR only |
| map.cpp:80:9:80:14 | map.cpp:66:37:66:42 | IR only |
| map.cpp:90:34:90:38 | map.cpp:90:24:90:29 | IR only |
| map.cpp:91:34:91:39 | map.cpp:91:24:91:29 | IR only |
| map.cpp:108:7:108:54 | map.cpp:108:39:108:44 | IR only |
| map.cpp:111:7:111:48 | map.cpp:111:34:111:39 | IR only |
| map.cpp:114:7:114:8 | map.cpp:108:39:108:44 | AST only |
| map.cpp:116:7:116:8 | map.cpp:110:62:110:67 | AST only |
| map.cpp:117:7:117:8 | map.cpp:111:34:111:39 | AST only |
| map.cpp:118:7:118:8 | map.cpp:112:46:112:51 | AST only |
| map.cpp:123:10:123:13 | map.cpp:111:34:111:39 | AST only |
| map.cpp:124:10:124:13 | map.cpp:112:46:112:51 | AST only |
| map.cpp:129:10:129:13 | map.cpp:111:34:111:39 | AST only |
| map.cpp:130:10:130:13 | map.cpp:112:46:112:51 | AST only |
| map.cpp:137:7:137:8 | map.cpp:108:39:108:44 | AST only |
| map.cpp:138:7:138:8 | map.cpp:108:39:108:44 | AST only |
| map.cpp:139:7:139:8 | map.cpp:108:39:108:44 | AST only |
| map.cpp:140:10:140:13 | map.cpp:108:39:108:44 | AST only |
| map.cpp:141:10:141:13 | map.cpp:108:39:108:44 | AST only |
| map.cpp:155:12:155:16 | map.cpp:108:39:108:44 | IR only |
| map.cpp:156:12:156:17 | map.cpp:108:39:108:44 | IR only |
| map.cpp:161:12:161:16 | map.cpp:108:39:108:44 | IR only |
@@ -52,44 +37,10 @@
| map.cpp:184:7:184:31 | map.cpp:108:39:108:44 | IR only |
| map.cpp:185:7:185:32 | map.cpp:108:39:108:44 | IR only |
| map.cpp:187:7:187:32 | map.cpp:108:39:108:44 | IR only |
| map.cpp:193:7:193:9 | map.cpp:191:49:191:54 | AST only |
| map.cpp:196:7:196:9 | map.cpp:192:49:192:54 | AST only |
| map.cpp:199:7:199:9 | map.cpp:191:49:191:54 | AST only |
| map.cpp:200:7:200:9 | map.cpp:191:49:191:54 | AST only |
| map.cpp:201:7:201:9 | map.cpp:192:49:192:54 | AST only |
| map.cpp:202:7:202:9 | map.cpp:192:49:192:54 | AST only |
| map.cpp:210:7:210:9 | map.cpp:206:49:206:54 | AST only |
| map.cpp:213:7:213:9 | map.cpp:209:49:209:54 | AST only |
| map.cpp:216:7:216:9 | map.cpp:206:49:206:54 | AST only |
| map.cpp:218:7:218:9 | map.cpp:209:49:209:54 | AST only |
| map.cpp:219:7:219:9 | map.cpp:209:49:209:54 | AST only |
| map.cpp:225:7:225:9 | map.cpp:223:49:223:54 | AST only |
| map.cpp:225:7:225:9 | map.cpp:224:49:224:54 | AST only |
| map.cpp:227:7:227:9 | map.cpp:223:49:223:54 | AST only |
| map.cpp:227:7:227:9 | map.cpp:224:49:224:54 | AST only |
| map.cpp:229:7:229:9 | map.cpp:223:49:223:54 | AST only |
| map.cpp:229:7:229:9 | map.cpp:224:49:224:54 | AST only |
| map.cpp:235:7:235:40 | map.cpp:235:26:235:31 | IR only |
| map.cpp:236:7:236:9 | map.cpp:235:26:235:31 | AST only |
| map.cpp:240:7:240:9 | map.cpp:239:44:239:49 | AST only |
| map.cpp:246:7:246:44 | map.cpp:246:30:246:35 | IR only |
| map.cpp:247:7:247:9 | map.cpp:246:30:246:35 | AST only |
| map.cpp:251:7:251:9 | map.cpp:250:43:250:48 | AST only |
| map.cpp:260:7:260:54 | map.cpp:260:39:260:44 | IR only |
| map.cpp:263:7:263:48 | map.cpp:263:34:263:39 | IR only |
| map.cpp:266:7:266:8 | map.cpp:260:39:260:44 | AST only |
| map.cpp:268:7:268:8 | map.cpp:262:62:262:67 | AST only |
| map.cpp:269:7:269:8 | map.cpp:263:34:263:39 | AST only |
| map.cpp:270:7:270:8 | map.cpp:264:46:264:51 | AST only |
| map.cpp:275:10:275:13 | map.cpp:263:34:263:39 | AST only |
| map.cpp:276:10:276:13 | map.cpp:264:46:264:51 | AST only |
| map.cpp:281:10:281:13 | map.cpp:263:34:263:39 | AST only |
| map.cpp:282:10:282:13 | map.cpp:264:46:264:51 | AST only |
| map.cpp:289:7:289:8 | map.cpp:260:39:260:44 | AST only |
| map.cpp:290:7:290:8 | map.cpp:260:39:260:44 | AST only |
| map.cpp:291:7:291:8 | map.cpp:260:39:260:44 | AST only |
| map.cpp:292:10:292:13 | map.cpp:260:39:260:44 | AST only |
| map.cpp:293:10:293:13 | map.cpp:260:39:260:44 | AST only |
| map.cpp:307:12:307:16 | map.cpp:260:39:260:44 | IR only |
| map.cpp:308:12:308:17 | map.cpp:260:39:260:44 | IR only |
| map.cpp:313:12:313:16 | map.cpp:260:39:260:44 | IR only |
@@ -99,105 +50,25 @@
| map.cpp:334:7:334:31 | map.cpp:260:39:260:44 | IR only |
| map.cpp:335:7:335:32 | map.cpp:260:39:260:44 | IR only |
| map.cpp:336:7:336:32 | map.cpp:260:39:260:44 | IR only |
| map.cpp:342:7:342:9 | map.cpp:340:49:340:54 | AST only |
| map.cpp:345:7:345:9 | map.cpp:341:49:341:54 | AST only |
| map.cpp:348:7:348:9 | map.cpp:340:49:340:54 | AST only |
| map.cpp:349:7:349:9 | map.cpp:340:49:340:54 | AST only |
| map.cpp:350:7:350:9 | map.cpp:341:49:341:54 | AST only |
| map.cpp:351:7:351:9 | map.cpp:341:49:341:54 | AST only |
| map.cpp:359:7:359:9 | map.cpp:355:49:355:54 | AST only |
| map.cpp:362:7:362:9 | map.cpp:358:49:358:54 | AST only |
| map.cpp:365:7:365:9 | map.cpp:355:49:355:54 | AST only |
| map.cpp:367:7:367:9 | map.cpp:358:49:358:54 | AST only |
| map.cpp:368:7:368:9 | map.cpp:358:49:358:54 | AST only |
| map.cpp:374:7:374:9 | map.cpp:372:49:372:54 | AST only |
| map.cpp:374:7:374:9 | map.cpp:373:49:373:54 | AST only |
| map.cpp:376:7:376:9 | map.cpp:372:49:372:54 | AST only |
| map.cpp:376:7:376:9 | map.cpp:373:49:373:54 | AST only |
| map.cpp:378:7:378:9 | map.cpp:372:49:372:54 | AST only |
| map.cpp:378:7:378:9 | map.cpp:373:49:373:54 | AST only |
| map.cpp:384:7:384:40 | map.cpp:384:26:384:31 | IR only |
| map.cpp:385:7:385:9 | map.cpp:384:26:384:31 | AST only |
| map.cpp:389:7:389:9 | map.cpp:388:44:388:49 | AST only |
| map.cpp:396:7:396:44 | map.cpp:396:30:396:35 | IR only |
| map.cpp:397:40:397:45 | map.cpp:396:30:396:35 | IR only |
| map.cpp:397:40:397:45 | map.cpp:397:30:397:35 | IR only |
| map.cpp:398:7:398:9 | map.cpp:396:30:396:35 | AST only |
| map.cpp:398:7:398:9 | map.cpp:397:30:397:35 | AST only |
| map.cpp:402:7:402:9 | map.cpp:401:43:401:48 | AST only |
| map.cpp:417:7:417:9 | map.cpp:416:30:416:35 | AST only |
| map.cpp:418:7:418:16 | map.cpp:416:30:416:35 | AST only |
| map.cpp:420:7:420:9 | map.cpp:419:33:419:38 | AST only |
| map.cpp:421:7:421:16 | map.cpp:419:33:419:38 | AST only |
| map.cpp:431:7:431:67 | map.cpp:431:52:431:57 | IR only |
| map.cpp:432:7:432:9 | map.cpp:431:52:431:57 | AST only |
| movableclass.cpp:65:11:65:11 | movableclass.cpp:65:13:65:18 | AST only |
| movableclass.cpp:65:11:65:21 | movableclass.cpp:65:13:65:18 | IR only |
| set.cpp:20:7:20:31 | set.cpp:20:17:20:22 | IR only |
| set.cpp:26:7:26:8 | set.cpp:20:17:20:22 | AST only |
| set.cpp:28:7:28:8 | set.cpp:22:29:22:34 | AST only |
| set.cpp:30:7:30:8 | set.cpp:20:17:20:22 | AST only |
| set.cpp:44:7:44:8 | set.cpp:20:17:20:22 | AST only |
| set.cpp:45:7:45:8 | set.cpp:20:17:20:22 | AST only |
| set.cpp:46:7:46:8 | set.cpp:20:17:20:22 | AST only |
| set.cpp:47:7:47:9 | set.cpp:20:17:20:22 | AST only |
| set.cpp:48:10:48:13 | set.cpp:20:17:20:22 | AST only |
| set.cpp:49:10:49:13 | set.cpp:20:17:20:22 | AST only |
| set.cpp:61:8:61:11 | set.cpp:20:17:20:22 | IR only |
| set.cpp:71:7:71:32 | set.cpp:67:13:67:18 | IR only |
| set.cpp:72:7:72:33 | set.cpp:67:13:67:18 | IR only |
| set.cpp:78:7:78:9 | set.cpp:76:13:76:18 | AST only |
| set.cpp:81:7:81:9 | set.cpp:77:13:77:18 | AST only |
| set.cpp:84:7:84:9 | set.cpp:76:13:76:18 | AST only |
| set.cpp:85:7:85:9 | set.cpp:76:13:76:18 | AST only |
| set.cpp:86:7:86:9 | set.cpp:77:13:77:18 | AST only |
| set.cpp:87:7:87:9 | set.cpp:77:13:77:18 | AST only |
| set.cpp:95:7:95:9 | set.cpp:91:13:91:18 | AST only |
| set.cpp:98:7:98:9 | set.cpp:94:13:94:18 | AST only |
| set.cpp:101:7:101:9 | set.cpp:91:13:91:18 | AST only |
| set.cpp:103:7:103:9 | set.cpp:94:13:94:18 | AST only |
| set.cpp:104:7:104:9 | set.cpp:94:13:94:18 | AST only |
| set.cpp:110:7:110:9 | set.cpp:108:13:108:18 | AST only |
| set.cpp:110:7:110:9 | set.cpp:109:13:109:18 | AST only |
| set.cpp:112:7:112:9 | set.cpp:108:13:108:18 | AST only |
| set.cpp:112:7:112:9 | set.cpp:109:13:109:18 | AST only |
| set.cpp:114:7:114:9 | set.cpp:108:13:108:18 | AST only |
| set.cpp:114:7:114:9 | set.cpp:109:13:109:18 | AST only |
| set.cpp:120:7:120:33 | set.cpp:120:19:120:24 | IR only |
| set.cpp:121:7:121:9 | set.cpp:120:19:120:24 | AST only |
| set.cpp:125:7:125:9 | set.cpp:124:37:124:42 | AST only |
| set.cpp:134:7:134:31 | set.cpp:134:17:134:22 | IR only |
| set.cpp:140:7:140:8 | set.cpp:134:17:134:22 | AST only |
| set.cpp:142:7:142:8 | set.cpp:136:29:136:34 | AST only |
| set.cpp:144:7:144:8 | set.cpp:134:17:134:22 | AST only |
| set.cpp:158:7:158:8 | set.cpp:134:17:134:22 | AST only |
| set.cpp:159:7:159:8 | set.cpp:134:17:134:22 | AST only |
| set.cpp:160:7:160:8 | set.cpp:134:17:134:22 | AST only |
| set.cpp:161:7:161:9 | set.cpp:134:17:134:22 | AST only |
| set.cpp:162:10:162:13 | set.cpp:134:17:134:22 | AST only |
| set.cpp:163:10:163:13 | set.cpp:134:17:134:22 | AST only |
| set.cpp:175:8:175:11 | set.cpp:134:17:134:22 | IR only |
| set.cpp:183:7:183:32 | set.cpp:181:13:181:18 | IR only |
| set.cpp:184:7:184:33 | set.cpp:181:13:181:18 | IR only |
| set.cpp:190:7:190:9 | set.cpp:188:13:188:18 | AST only |
| set.cpp:193:7:193:9 | set.cpp:189:13:189:18 | AST only |
| set.cpp:196:7:196:9 | set.cpp:188:13:188:18 | AST only |
| set.cpp:197:7:197:9 | set.cpp:188:13:188:18 | AST only |
| set.cpp:198:7:198:9 | set.cpp:189:13:189:18 | AST only |
| set.cpp:199:7:199:9 | set.cpp:189:13:189:18 | AST only |
| set.cpp:207:7:207:9 | set.cpp:203:13:203:18 | AST only |
| set.cpp:210:7:210:9 | set.cpp:206:13:206:18 | AST only |
| set.cpp:213:7:213:9 | set.cpp:203:13:203:18 | AST only |
| set.cpp:215:7:215:9 | set.cpp:206:13:206:18 | AST only |
| set.cpp:216:7:216:9 | set.cpp:206:13:206:18 | AST only |
| set.cpp:222:7:222:9 | set.cpp:220:13:220:18 | AST only |
| set.cpp:222:7:222:9 | set.cpp:221:13:221:18 | AST only |
| set.cpp:224:7:224:9 | set.cpp:220:13:220:18 | AST only |
| set.cpp:224:7:224:9 | set.cpp:221:13:221:18 | AST only |
| set.cpp:226:7:226:9 | set.cpp:220:13:220:18 | AST only |
| set.cpp:226:7:226:9 | set.cpp:221:13:221:18 | AST only |
| set.cpp:232:7:232:33 | set.cpp:232:19:232:24 | IR only |
| set.cpp:233:7:233:9 | set.cpp:232:19:232:24 | AST only |
| set.cpp:237:7:237:9 | set.cpp:236:37:236:42 | AST only |
| smart_pointer.cpp:12:10:12:10 | smart_pointer.cpp:11:52:11:57 | AST only |
| smart_pointer.cpp:24:10:24:10 | smart_pointer.cpp:23:52:23:57 | AST only |
| standalone_iterators.cpp:41:10:41:10 | standalone_iterators.cpp:39:45:39:51 | AST only |
@@ -211,6 +82,10 @@
| string.cpp:46:13:46:17 | string.cpp:14:10:14:15 | AST only |
| string.cpp:70:7:70:8 | string.cpp:62:19:62:24 | AST only |
| string.cpp:126:8:126:11 | string.cpp:120:16:120:21 | IR only |
| string.cpp:145:8:145:14 | string.cpp:142:18:142:23 | IR only |
| string.cpp:146:8:146:14 | string.cpp:142:18:142:23 | IR only |
| string.cpp:147:8:147:14 | string.cpp:142:18:142:23 | IR only |
| string.cpp:150:8:150:20 | string.cpp:150:13:150:18 | IR only |
| string.cpp:162:11:162:11 | string.cpp:155:18:155:23 | AST only |
| string.cpp:166:11:166:11 | string.cpp:166:14:166:19 | AST only |
| string.cpp:167:11:167:11 | string.cpp:166:14:166:19 | AST only |
@@ -223,6 +98,7 @@
| string.cpp:247:10:247:16 | string.cpp:234:17:234:22 | AST only |
| string.cpp:251:10:251:16 | string.cpp:235:11:235:25 | AST only |
| string.cpp:312:9:312:12 | string.cpp:309:16:309:21 | AST only |
| string.cpp:323:7:323:29 | string.cpp:320:16:320:21 | IR only |
| string.cpp:340:7:340:7 | string.cpp:336:9:336:23 | AST only |
| string.cpp:341:7:341:7 | string.cpp:337:12:337:26 | AST only |
| string.cpp:342:7:342:7 | string.cpp:336:9:336:23 | AST only |
@@ -231,8 +107,8 @@
| string.cpp:363:11:363:16 | string.cpp:358:18:358:23 | AST only |
| string.cpp:382:8:382:14 | string.cpp:374:18:374:23 | IR only |
| string.cpp:383:13:383:15 | string.cpp:374:18:374:23 | IR only |
| string.cpp:396:8:396:8 | string.cpp:389:18:389:23 | AST only |
| string.cpp:397:8:397:8 | string.cpp:389:18:389:23 | AST only |
| string.cpp:396:8:396:15 | string.cpp:389:18:389:23 | IR only |
| string.cpp:397:8:397:15 | string.cpp:389:18:389:23 | IR only |
| string.cpp:399:8:399:8 | string.cpp:389:18:389:23 | AST only |
| string.cpp:401:8:401:8 | string.cpp:389:18:389:23 | AST only |
| string.cpp:404:8:404:11 | string.cpp:389:18:389:23 | IR only |
@@ -241,9 +117,7 @@
| string.cpp:411:8:411:8 | string.cpp:389:18:389:23 | AST only |
| string.cpp:415:8:415:11 | string.cpp:389:18:389:23 | IR only |
| string.cpp:418:8:418:8 | string.cpp:389:18:389:23 | AST only |
| string.cpp:419:8:419:10 | string.cpp:389:18:389:23 | AST only |
| string.cpp:421:8:421:8 | string.cpp:389:18:389:23 | AST only |
| string.cpp:422:8:422:10 | string.cpp:389:18:389:23 | AST only |
| string.cpp:436:10:436:15 | string.cpp:431:14:431:19 | AST only |
| string.cpp:449:10:449:15 | string.cpp:449:32:449:46 | AST only |
| string.cpp:462:10:462:15 | string.cpp:457:18:457:23 | AST only |
@@ -268,7 +142,9 @@
| stringstream.cpp:35:11:35:11 | stringstream.cpp:29:16:29:21 | AST only |
| stringstream.cpp:39:7:39:9 | stringstream.cpp:33:23:33:28 | AST only |
| stringstream.cpp:41:7:41:9 | stringstream.cpp:29:16:29:21 | AST only |
| stringstream.cpp:43:7:43:15 | stringstream.cpp:32:14:32:19 | IR only |
| stringstream.cpp:44:11:44:13 | stringstream.cpp:33:23:33:28 | AST only |
| stringstream.cpp:45:7:45:15 | stringstream.cpp:34:14:34:19 | IR only |
| stringstream.cpp:46:11:46:13 | stringstream.cpp:29:16:29:21 | AST only |
| stringstream.cpp:56:11:56:13 | stringstream.cpp:56:15:56:29 | AST only |
| stringstream.cpp:57:44:57:46 | stringstream.cpp:57:25:57:39 | AST only |
@@ -278,6 +154,7 @@
| stringstream.cpp:67:7:67:10 | stringstream.cpp:64:36:64:41 | AST only |
| stringstream.cpp:76:11:76:11 | stringstream.cpp:70:32:70:37 | AST only |
| stringstream.cpp:78:11:78:11 | stringstream.cpp:70:32:70:37 | AST only |
| stringstream.cpp:83:7:83:15 | stringstream.cpp:70:32:70:37 | IR only |
| stringstream.cpp:100:11:100:11 | stringstream.cpp:100:31:100:36 | AST only |
| stringstream.cpp:143:11:143:22 | stringstream.cpp:143:14:143:19 | IR only |
| stringstream.cpp:146:11:146:11 | stringstream.cpp:143:14:143:19 | AST only |
@@ -307,13 +184,13 @@
| stringstream.cpp:266:62:266:66 | stringstream.cpp:266:41:266:46 | AST only |
| stringstream.cpp:267:7:267:9 | stringstream.cpp:266:41:266:46 | AST only |
| swap1.cpp:78:12:78:16 | swap1.cpp:69:23:69:23 | AST only |
| swap1.cpp:87:13:87:17 | swap1.cpp:82:16:82:21 | AST only |
| swap1.cpp:88:13:88:17 | swap1.cpp:81:27:81:28 | AST only |
| swap1.cpp:102:12:102:16 | swap1.cpp:93:23:93:23 | AST only |
| swap1.cpp:115:18:115:22 | swap1.cpp:108:23:108:31 | AST only |
| swap1.cpp:129:12:129:16 | swap1.cpp:120:23:120:23 | AST only |
| swap1.cpp:144:12:144:16 | swap1.cpp:135:23:135:23 | AST only |
| swap2.cpp:78:12:78:16 | swap2.cpp:69:23:69:23 | AST only |
| swap2.cpp:87:13:87:17 | swap2.cpp:82:16:82:21 | IR only |
| swap2.cpp:88:13:88:17 | swap2.cpp:81:27:81:28 | AST only |
| swap2.cpp:102:12:102:16 | swap2.cpp:93:23:93:23 | AST only |
| swap2.cpp:115:18:115:22 | swap2.cpp:108:23:108:31 | AST only |
@@ -358,7 +235,6 @@
| vector.cpp:171:13:171:13 | vector.cpp:170:14:170:19 | AST only |
| vector.cpp:180:13:180:13 | vector.cpp:179:14:179:19 | AST only |
| vector.cpp:201:13:201:13 | vector.cpp:200:14:200:19 | AST only |
| vector.cpp:261:8:261:9 | vector.cpp:239:15:239:20 | AST only |
| vector.cpp:286:10:286:13 | vector.cpp:284:15:284:20 | AST only |
| vector.cpp:287:7:287:18 | vector.cpp:284:15:284:20 | AST only |
| vector.cpp:290:7:290:8 | vector.cpp:289:17:289:30 | AST only |

View File

@@ -26,6 +26,7 @@
| copyableclass.cpp:67:11:67:21 | (reference dereference) | copyableclass.cpp:67:13:67:18 | call to source |
| copyableclass_declonly.cpp:40:8:40:9 | s1 | copyableclass_declonly.cpp:34:30:34:35 | call to source |
| copyableclass_declonly.cpp:41:8:41:9 | s2 | copyableclass_declonly.cpp:35:32:35:37 | call to source |
| copyableclass_declonly.cpp:42:8:42:9 | s3 | copyableclass_declonly.cpp:34:30:34:35 | call to source |
| copyableclass_declonly.cpp:43:8:43:9 | s4 | copyableclass_declonly.cpp:38:8:38:13 | call to source |
| copyableclass_declonly.cpp:65:8:65:9 | s1 | copyableclass_declonly.cpp:60:56:60:61 | call to source |
| copyableclass_declonly.cpp:66:8:66:9 | s2 | copyableclass_declonly.cpp:63:32:63:37 | call to source |
@@ -66,6 +67,7 @@
| map.cpp:79:9:79:13 | first | map.cpp:66:37:66:42 | call to source |
| map.cpp:80:9:80:14 | second | map.cpp:66:37:66:42 | call to source |
| map.cpp:81:7:81:7 | l | map.cpp:66:37:66:42 | call to source |
| map.cpp:87:34:87:38 | first | map.cpp:87:17:87:22 | call to source |
| map.cpp:89:7:89:32 | call to pair | map.cpp:89:24:89:29 | call to source |
| map.cpp:90:34:90:38 | first | map.cpp:90:24:90:29 | call to source |
| map.cpp:91:34:91:39 | second | map.cpp:91:24:91:29 | call to source |
@@ -73,10 +75,23 @@
| map.cpp:110:10:110:15 | call to insert | map.cpp:110:62:110:67 | call to source |
| map.cpp:111:7:111:48 | call to iterator | map.cpp:111:34:111:39 | call to source |
| map.cpp:112:10:112:25 | call to insert_or_assign | map.cpp:112:46:112:51 | call to source |
| map.cpp:114:7:114:8 | call to map | map.cpp:108:39:108:44 | call to source |
| map.cpp:116:7:116:8 | call to map | map.cpp:110:62:110:67 | call to source |
| map.cpp:117:7:117:8 | call to map | map.cpp:111:34:111:39 | call to source |
| map.cpp:118:7:118:8 | call to map | map.cpp:112:46:112:51 | call to source |
| map.cpp:120:10:120:13 | call to find | map.cpp:108:39:108:44 | call to source |
| map.cpp:122:10:122:13 | call to find | map.cpp:110:62:110:67 | call to source |
| map.cpp:123:10:123:13 | call to find | map.cpp:111:34:111:39 | call to source |
| map.cpp:124:10:124:13 | call to find | map.cpp:112:46:112:51 | call to source |
| map.cpp:126:10:126:13 | call to find | map.cpp:108:39:108:44 | call to source |
| map.cpp:128:10:128:13 | call to find | map.cpp:110:62:110:67 | call to source |
| map.cpp:129:10:129:13 | call to find | map.cpp:111:34:111:39 | call to source |
| map.cpp:130:10:130:13 | call to find | map.cpp:112:46:112:51 | call to source |
| map.cpp:137:7:137:8 | call to map | map.cpp:108:39:108:44 | call to source |
| map.cpp:138:7:138:8 | call to map | map.cpp:108:39:108:44 | call to source |
| map.cpp:139:7:139:8 | call to map | map.cpp:108:39:108:44 | call to source |
| map.cpp:140:10:140:13 | call to find | map.cpp:108:39:108:44 | call to source |
| map.cpp:141:10:141:13 | call to find | map.cpp:108:39:108:44 | call to source |
| map.cpp:142:10:142:13 | call to find | map.cpp:108:39:108:44 | call to source |
| map.cpp:154:8:154:10 | call to pair | map.cpp:108:39:108:44 | call to source |
| map.cpp:155:12:155:16 | first | map.cpp:108:39:108:44 | call to source |
@@ -91,20 +106,54 @@
| map.cpp:185:7:185:32 | call to iterator | map.cpp:108:39:108:44 | call to source |
| map.cpp:186:10:186:20 | call to upper_bound | map.cpp:108:39:108:44 | call to source |
| map.cpp:187:7:187:32 | call to iterator | map.cpp:108:39:108:44 | call to source |
| map.cpp:193:7:193:9 | call to map | map.cpp:191:49:191:54 | call to source |
| map.cpp:196:7:196:9 | call to map | map.cpp:192:49:192:54 | call to source |
| map.cpp:199:7:199:9 | call to map | map.cpp:191:49:191:54 | call to source |
| map.cpp:200:7:200:9 | call to map | map.cpp:191:49:191:54 | call to source |
| map.cpp:201:7:201:9 | call to map | map.cpp:192:49:192:54 | call to source |
| map.cpp:202:7:202:9 | call to map | map.cpp:192:49:192:54 | call to source |
| map.cpp:210:7:210:9 | call to map | map.cpp:206:49:206:54 | call to source |
| map.cpp:213:7:213:9 | call to map | map.cpp:209:49:209:54 | call to source |
| map.cpp:216:7:216:9 | call to map | map.cpp:206:49:206:54 | call to source |
| map.cpp:218:7:218:9 | call to map | map.cpp:209:49:209:54 | call to source |
| map.cpp:219:7:219:9 | call to map | map.cpp:209:49:209:54 | call to source |
| map.cpp:225:7:225:9 | call to map | map.cpp:223:49:223:54 | call to source |
| map.cpp:225:7:225:9 | call to map | map.cpp:224:49:224:54 | call to source |
| map.cpp:226:11:226:15 | call to erase | map.cpp:223:49:223:54 | call to source |
| map.cpp:226:11:226:15 | call to erase | map.cpp:224:49:224:54 | call to source |
| map.cpp:227:7:227:9 | call to map | map.cpp:223:49:223:54 | call to source |
| map.cpp:227:7:227:9 | call to map | map.cpp:224:49:224:54 | call to source |
| map.cpp:229:7:229:9 | call to map | map.cpp:223:49:223:54 | call to source |
| map.cpp:229:7:229:9 | call to map | map.cpp:224:49:224:54 | call to source |
| map.cpp:235:7:235:40 | call to iterator | map.cpp:235:26:235:31 | call to source |
| map.cpp:236:7:236:9 | call to map | map.cpp:235:26:235:31 | call to source |
| map.cpp:239:11:239:22 | call to emplace_hint | map.cpp:239:44:239:49 | call to source |
| map.cpp:240:7:240:9 | call to map | map.cpp:239:44:239:49 | call to source |
| map.cpp:246:7:246:44 | call to iterator | map.cpp:246:30:246:35 | call to source |
| map.cpp:247:7:247:9 | call to map | map.cpp:246:30:246:35 | call to source |
| map.cpp:250:11:250:21 | call to try_emplace | map.cpp:250:43:250:48 | call to source |
| map.cpp:251:7:251:9 | call to map | map.cpp:250:43:250:48 | call to source |
| map.cpp:260:7:260:54 | call to iterator | map.cpp:260:39:260:44 | call to source |
| map.cpp:262:10:262:15 | call to insert | map.cpp:262:62:262:67 | call to source |
| map.cpp:263:7:263:48 | call to iterator | map.cpp:263:34:263:39 | call to source |
| map.cpp:264:10:264:25 | call to insert_or_assign | map.cpp:264:46:264:51 | call to source |
| map.cpp:266:7:266:8 | call to unordered_map | map.cpp:260:39:260:44 | call to source |
| map.cpp:268:7:268:8 | call to unordered_map | map.cpp:262:62:262:67 | call to source |
| map.cpp:269:7:269:8 | call to unordered_map | map.cpp:263:34:263:39 | call to source |
| map.cpp:270:7:270:8 | call to unordered_map | map.cpp:264:46:264:51 | call to source |
| map.cpp:272:10:272:13 | call to find | map.cpp:260:39:260:44 | call to source |
| map.cpp:274:10:274:13 | call to find | map.cpp:262:62:262:67 | call to source |
| map.cpp:275:10:275:13 | call to find | map.cpp:263:34:263:39 | call to source |
| map.cpp:276:10:276:13 | call to find | map.cpp:264:46:264:51 | call to source |
| map.cpp:278:10:278:13 | call to find | map.cpp:260:39:260:44 | call to source |
| map.cpp:280:10:280:13 | call to find | map.cpp:262:62:262:67 | call to source |
| map.cpp:281:10:281:13 | call to find | map.cpp:263:34:263:39 | call to source |
| map.cpp:282:10:282:13 | call to find | map.cpp:264:46:264:51 | call to source |
| map.cpp:289:7:289:8 | call to unordered_map | map.cpp:260:39:260:44 | call to source |
| map.cpp:290:7:290:8 | call to unordered_map | map.cpp:260:39:260:44 | call to source |
| map.cpp:291:7:291:8 | call to unordered_map | map.cpp:260:39:260:44 | call to source |
| map.cpp:292:10:292:13 | call to find | map.cpp:260:39:260:44 | call to source |
| map.cpp:293:10:293:13 | call to find | map.cpp:260:39:260:44 | call to source |
| map.cpp:294:10:294:13 | call to find | map.cpp:260:39:260:44 | call to source |
| map.cpp:306:8:306:10 | call to pair | map.cpp:260:39:260:44 | call to source |
| map.cpp:307:12:307:16 | first | map.cpp:260:39:260:44 | call to source |
@@ -116,16 +165,42 @@
| map.cpp:334:7:334:31 | call to iterator | map.cpp:260:39:260:44 | call to source |
| map.cpp:335:7:335:32 | call to iterator | map.cpp:260:39:260:44 | call to source |
| map.cpp:336:7:336:32 | call to iterator | map.cpp:260:39:260:44 | call to source |
| map.cpp:342:7:342:9 | call to unordered_map | map.cpp:340:49:340:54 | call to source |
| map.cpp:345:7:345:9 | call to unordered_map | map.cpp:341:49:341:54 | call to source |
| map.cpp:348:7:348:9 | call to unordered_map | map.cpp:340:49:340:54 | call to source |
| map.cpp:349:7:349:9 | call to unordered_map | map.cpp:340:49:340:54 | call to source |
| map.cpp:350:7:350:9 | call to unordered_map | map.cpp:341:49:341:54 | call to source |
| map.cpp:351:7:351:9 | call to unordered_map | map.cpp:341:49:341:54 | call to source |
| map.cpp:359:7:359:9 | call to unordered_map | map.cpp:355:49:355:54 | call to source |
| map.cpp:362:7:362:9 | call to unordered_map | map.cpp:358:49:358:54 | call to source |
| map.cpp:365:7:365:9 | call to unordered_map | map.cpp:355:49:355:54 | call to source |
| map.cpp:367:7:367:9 | call to unordered_map | map.cpp:358:49:358:54 | call to source |
| map.cpp:368:7:368:9 | call to unordered_map | map.cpp:358:49:358:54 | call to source |
| map.cpp:374:7:374:9 | call to unordered_map | map.cpp:372:49:372:54 | call to source |
| map.cpp:374:7:374:9 | call to unordered_map | map.cpp:373:49:373:54 | call to source |
| map.cpp:375:11:375:15 | call to erase | map.cpp:372:49:372:54 | call to source |
| map.cpp:375:11:375:15 | call to erase | map.cpp:373:49:373:54 | call to source |
| map.cpp:376:7:376:9 | call to unordered_map | map.cpp:372:49:372:54 | call to source |
| map.cpp:376:7:376:9 | call to unordered_map | map.cpp:373:49:373:54 | call to source |
| map.cpp:378:7:378:9 | call to unordered_map | map.cpp:372:49:372:54 | call to source |
| map.cpp:378:7:378:9 | call to unordered_map | map.cpp:373:49:373:54 | call to source |
| map.cpp:384:7:384:40 | call to iterator | map.cpp:384:26:384:31 | call to source |
| map.cpp:385:7:385:9 | call to unordered_map | map.cpp:384:26:384:31 | call to source |
| map.cpp:388:11:388:22 | call to emplace_hint | map.cpp:388:44:388:49 | call to source |
| map.cpp:389:7:389:9 | call to unordered_map | map.cpp:388:44:388:49 | call to source |
| map.cpp:396:7:396:44 | call to iterator | map.cpp:396:30:396:35 | call to source |
| map.cpp:397:40:397:45 | second | map.cpp:396:30:396:35 | call to source |
| map.cpp:397:40:397:45 | second | map.cpp:397:30:397:35 | call to source |
| map.cpp:398:7:398:9 | call to unordered_map | map.cpp:396:30:396:35 | call to source |
| map.cpp:398:7:398:9 | call to unordered_map | map.cpp:397:30:397:35 | call to source |
| map.cpp:401:11:401:21 | call to try_emplace | map.cpp:401:43:401:48 | call to source |
| map.cpp:402:7:402:9 | call to unordered_map | map.cpp:401:43:401:48 | call to source |
| map.cpp:416:7:416:41 | call to pair | map.cpp:416:30:416:35 | call to source |
| map.cpp:417:7:417:9 | call to unordered_map | map.cpp:416:30:416:35 | call to source |
| map.cpp:419:7:419:41 | call to pair | map.cpp:419:33:419:38 | call to source |
| map.cpp:420:7:420:9 | call to unordered_map | map.cpp:419:33:419:38 | call to source |
| map.cpp:431:7:431:67 | call to iterator | map.cpp:431:52:431:57 | call to source |
| map.cpp:432:7:432:9 | call to unordered_map | map.cpp:431:52:431:57 | call to source |
| map.cpp:433:11:433:22 | call to emplace_hint | map.cpp:431:52:431:57 | call to source |
| movableclass.cpp:44:8:44:9 | s1 | movableclass.cpp:39:21:39:26 | call to source |
| movableclass.cpp:45:8:45:9 | s2 | movableclass.cpp:40:23:40:28 | call to source |
@@ -136,9 +211,18 @@
| movableclass.cpp:65:11:65:21 | (reference dereference) | movableclass.cpp:65:13:65:18 | call to source |
| set.cpp:20:7:20:31 | call to iterator | set.cpp:20:17:20:22 | call to source |
| set.cpp:22:10:22:15 | call to insert | set.cpp:22:29:22:34 | call to source |
| set.cpp:26:7:26:8 | call to set | set.cpp:20:17:20:22 | call to source |
| set.cpp:28:7:28:8 | call to set | set.cpp:22:29:22:34 | call to source |
| set.cpp:30:7:30:8 | call to set | set.cpp:20:17:20:22 | call to source |
| set.cpp:32:10:32:13 | call to find | set.cpp:20:17:20:22 | call to source |
| set.cpp:34:10:34:13 | call to find | set.cpp:22:29:22:34 | call to source |
| set.cpp:36:10:36:13 | call to find | set.cpp:20:17:20:22 | call to source |
| set.cpp:44:7:44:8 | call to set | set.cpp:20:17:20:22 | call to source |
| set.cpp:45:7:45:8 | call to set | set.cpp:20:17:20:22 | call to source |
| set.cpp:46:7:46:8 | call to set | set.cpp:20:17:20:22 | call to source |
| set.cpp:47:7:47:9 | call to set | set.cpp:20:17:20:22 | call to source |
| set.cpp:48:10:48:13 | call to find | set.cpp:20:17:20:22 | call to source |
| set.cpp:49:10:49:13 | call to find | set.cpp:20:17:20:22 | call to source |
| set.cpp:50:10:50:13 | call to find | set.cpp:20:17:20:22 | call to source |
| set.cpp:51:11:51:14 | call to find | set.cpp:20:17:20:22 | call to source |
| set.cpp:61:8:61:8 | call to operator* | set.cpp:20:17:20:22 | call to source |
@@ -147,25 +231,72 @@
| set.cpp:70:11:70:21 | call to upper_bound | set.cpp:67:13:67:18 | call to source |
| set.cpp:71:7:71:32 | call to iterator | set.cpp:67:13:67:18 | call to source |
| set.cpp:72:7:72:33 | call to iterator | set.cpp:67:13:67:18 | call to source |
| set.cpp:78:7:78:9 | call to set | set.cpp:76:13:76:18 | call to source |
| set.cpp:81:7:81:9 | call to set | set.cpp:77:13:77:18 | call to source |
| set.cpp:84:7:84:9 | call to set | set.cpp:76:13:76:18 | call to source |
| set.cpp:85:7:85:9 | call to set | set.cpp:76:13:76:18 | call to source |
| set.cpp:86:7:86:9 | call to set | set.cpp:77:13:77:18 | call to source |
| set.cpp:87:7:87:9 | call to set | set.cpp:77:13:77:18 | call to source |
| set.cpp:95:7:95:9 | call to set | set.cpp:91:13:91:18 | call to source |
| set.cpp:98:7:98:9 | call to set | set.cpp:94:13:94:18 | call to source |
| set.cpp:101:7:101:9 | call to set | set.cpp:91:13:91:18 | call to source |
| set.cpp:103:7:103:9 | call to set | set.cpp:94:13:94:18 | call to source |
| set.cpp:104:7:104:9 | call to set | set.cpp:94:13:94:18 | call to source |
| set.cpp:110:7:110:9 | call to set | set.cpp:108:13:108:18 | call to source |
| set.cpp:110:7:110:9 | call to set | set.cpp:109:13:109:18 | call to source |
| set.cpp:111:11:111:15 | call to erase | set.cpp:108:13:108:18 | call to source |
| set.cpp:111:11:111:15 | call to erase | set.cpp:109:13:109:18 | call to source |
| set.cpp:112:7:112:9 | call to set | set.cpp:108:13:108:18 | call to source |
| set.cpp:112:7:112:9 | call to set | set.cpp:109:13:109:18 | call to source |
| set.cpp:114:7:114:9 | call to set | set.cpp:108:13:108:18 | call to source |
| set.cpp:114:7:114:9 | call to set | set.cpp:109:13:109:18 | call to source |
| set.cpp:120:7:120:33 | call to iterator | set.cpp:120:19:120:24 | call to source |
| set.cpp:121:7:121:9 | call to set | set.cpp:120:19:120:24 | call to source |
| set.cpp:124:11:124:22 | call to emplace_hint | set.cpp:124:37:124:42 | call to source |
| set.cpp:125:7:125:9 | call to set | set.cpp:124:37:124:42 | call to source |
| set.cpp:134:7:134:31 | call to iterator | set.cpp:134:17:134:22 | call to source |
| set.cpp:136:10:136:15 | call to insert | set.cpp:136:29:136:34 | call to source |
| set.cpp:140:7:140:8 | call to unordered_set | set.cpp:134:17:134:22 | call to source |
| set.cpp:142:7:142:8 | call to unordered_set | set.cpp:136:29:136:34 | call to source |
| set.cpp:144:7:144:8 | call to unordered_set | set.cpp:134:17:134:22 | call to source |
| set.cpp:146:10:146:13 | call to find | set.cpp:134:17:134:22 | call to source |
| set.cpp:148:10:148:13 | call to find | set.cpp:136:29:136:34 | call to source |
| set.cpp:150:10:150:13 | call to find | set.cpp:134:17:134:22 | call to source |
| set.cpp:158:7:158:8 | call to unordered_set | set.cpp:134:17:134:22 | call to source |
| set.cpp:159:7:159:8 | call to unordered_set | set.cpp:134:17:134:22 | call to source |
| set.cpp:160:7:160:8 | call to unordered_set | set.cpp:134:17:134:22 | call to source |
| set.cpp:161:7:161:9 | call to unordered_set | set.cpp:134:17:134:22 | call to source |
| set.cpp:162:10:162:13 | call to find | set.cpp:134:17:134:22 | call to source |
| set.cpp:163:10:163:13 | call to find | set.cpp:134:17:134:22 | call to source |
| set.cpp:164:10:164:13 | call to find | set.cpp:134:17:134:22 | call to source |
| set.cpp:165:11:165:14 | call to find | set.cpp:134:17:134:22 | call to source |
| set.cpp:175:8:175:8 | call to operator* | set.cpp:134:17:134:22 | call to source |
| set.cpp:175:8:175:11 | (reference dereference) | set.cpp:134:17:134:22 | call to source |
| set.cpp:183:7:183:32 | call to iterator | set.cpp:181:13:181:18 | call to source |
| set.cpp:184:7:184:33 | call to iterator | set.cpp:181:13:181:18 | call to source |
| set.cpp:190:7:190:9 | call to unordered_set | set.cpp:188:13:188:18 | call to source |
| set.cpp:193:7:193:9 | call to unordered_set | set.cpp:189:13:189:18 | call to source |
| set.cpp:196:7:196:9 | call to unordered_set | set.cpp:188:13:188:18 | call to source |
| set.cpp:197:7:197:9 | call to unordered_set | set.cpp:188:13:188:18 | call to source |
| set.cpp:198:7:198:9 | call to unordered_set | set.cpp:189:13:189:18 | call to source |
| set.cpp:199:7:199:9 | call to unordered_set | set.cpp:189:13:189:18 | call to source |
| set.cpp:207:7:207:9 | call to unordered_set | set.cpp:203:13:203:18 | call to source |
| set.cpp:210:7:210:9 | call to unordered_set | set.cpp:206:13:206:18 | call to source |
| set.cpp:213:7:213:9 | call to unordered_set | set.cpp:203:13:203:18 | call to source |
| set.cpp:215:7:215:9 | call to unordered_set | set.cpp:206:13:206:18 | call to source |
| set.cpp:216:7:216:9 | call to unordered_set | set.cpp:206:13:206:18 | call to source |
| set.cpp:222:7:222:9 | call to unordered_set | set.cpp:220:13:220:18 | call to source |
| set.cpp:222:7:222:9 | call to unordered_set | set.cpp:221:13:221:18 | call to source |
| set.cpp:223:11:223:15 | call to erase | set.cpp:220:13:220:18 | call to source |
| set.cpp:223:11:223:15 | call to erase | set.cpp:221:13:221:18 | call to source |
| set.cpp:224:7:224:9 | call to unordered_set | set.cpp:220:13:220:18 | call to source |
| set.cpp:224:7:224:9 | call to unordered_set | set.cpp:221:13:221:18 | call to source |
| set.cpp:226:7:226:9 | call to unordered_set | set.cpp:220:13:220:18 | call to source |
| set.cpp:226:7:226:9 | call to unordered_set | set.cpp:221:13:221:18 | call to source |
| set.cpp:232:7:232:33 | call to iterator | set.cpp:232:19:232:24 | call to source |
| set.cpp:233:7:233:9 | call to unordered_set | set.cpp:232:19:232:24 | call to source |
| set.cpp:236:11:236:22 | call to emplace_hint | set.cpp:236:37:236:42 | call to source |
| set.cpp:237:7:237:9 | call to unordered_set | set.cpp:236:37:236:42 | call to source |
| smart_pointer.cpp:13:10:13:10 | Argument 0 indirection | smart_pointer.cpp:11:52:11:57 | call to source |
| smart_pointer.cpp:25:10:25:10 | Argument 0 indirection | smart_pointer.cpp:23:52:23:57 | call to source |
| smart_pointer.cpp:52:12:52:14 | call to get | smart_pointer.cpp:51:52:51:57 | call to source |
@@ -189,9 +320,13 @@
| string.cpp:130:8:130:8 | c | string.cpp:120:16:120:21 | call to source |
| string.cpp:135:8:135:8 | (reference dereference) | string.cpp:133:28:133:33 | call to source |
| string.cpp:135:8:135:8 | c | string.cpp:133:28:133:33 | call to source |
| string.cpp:145:8:145:14 | Argument 0 indirection | string.cpp:142:18:142:23 | call to source |
| string.cpp:145:11:145:11 | call to operator+ | string.cpp:142:18:142:23 | call to source |
| string.cpp:146:8:146:14 | Argument 0 indirection | string.cpp:142:18:142:23 | call to source |
| string.cpp:146:11:146:11 | call to operator+ | string.cpp:142:18:142:23 | call to source |
| string.cpp:147:8:147:14 | Argument 0 indirection | string.cpp:142:18:142:23 | call to source |
| string.cpp:147:11:147:11 | call to operator+ | string.cpp:142:18:142:23 | call to source |
| string.cpp:150:8:150:20 | Argument 0 indirection | string.cpp:150:13:150:18 | call to source |
| string.cpp:150:11:150:11 | call to operator+ | string.cpp:150:13:150:18 | call to source |
| string.cpp:159:8:159:9 | Argument 0 indirection | string.cpp:155:18:155:23 | call to source |
| string.cpp:163:8:163:9 | Argument 0 indirection | string.cpp:155:18:155:23 | call to source |
@@ -220,18 +355,25 @@
| string.cpp:295:7:295:8 | Argument 0 indirection | string.cpp:291:17:291:22 | call to source |
| string.cpp:301:7:301:8 | Argument 0 indirection | string.cpp:289:17:289:22 | call to source |
| string.cpp:303:7:303:8 | Argument 0 indirection | string.cpp:291:17:291:22 | call to source |
| string.cpp:323:7:323:29 | Argument 0 indirection | string.cpp:320:16:320:21 | call to source |
| string.cpp:323:9:323:14 | call to substr | string.cpp:320:16:320:21 | call to source |
| string.cpp:364:8:364:9 | Argument 0 indirection | string.cpp:358:18:358:23 | call to source |
| string.cpp:382:8:382:8 | call to operator* | string.cpp:374:18:374:23 | call to source |
| string.cpp:382:8:382:14 | (reference dereference) | string.cpp:374:18:374:23 | call to source |
| string.cpp:383:13:383:13 | call to operator[] | string.cpp:374:18:374:23 | call to source |
| string.cpp:383:13:383:15 | (reference dereference) | string.cpp:374:18:374:23 | call to source |
| string.cpp:396:8:396:8 | call to operator* | string.cpp:389:18:389:23 | call to source |
| string.cpp:396:8:396:15 | (reference dereference) | string.cpp:389:18:389:23 | call to source |
| string.cpp:397:8:397:8 | call to operator* | string.cpp:389:18:389:23 | call to source |
| string.cpp:397:8:397:15 | (reference dereference) | string.cpp:389:18:389:23 | call to source |
| string.cpp:404:8:404:8 | call to operator* | string.cpp:389:18:389:23 | call to source |
| string.cpp:404:8:404:11 | (reference dereference) | string.cpp:389:18:389:23 | call to source |
| string.cpp:407:8:407:8 | call to operator* | string.cpp:389:18:389:23 | call to source |
| string.cpp:407:8:407:11 | (reference dereference) | string.cpp:389:18:389:23 | call to source |
| string.cpp:415:8:415:8 | call to operator* | string.cpp:389:18:389:23 | call to source |
| string.cpp:415:8:415:11 | (reference dereference) | string.cpp:389:18:389:23 | call to source |
| string.cpp:419:8:419:10 | call to iterator | string.cpp:389:18:389:23 | call to source |
| string.cpp:422:8:422:10 | call to iterator | string.cpp:389:18:389:23 | call to source |
| string.cpp:437:7:437:8 | Argument 0 indirection | string.cpp:431:14:431:19 | call to source |
| string.cpp:450:8:450:8 | Argument 0 indirection | string.cpp:449:32:449:46 | call to source |
| string.cpp:463:8:463:8 | Argument 0 indirection | string.cpp:457:18:457:23 | call to source |
@@ -254,13 +396,16 @@
| stringstream.cpp:34:23:34:31 | (reference dereference) | stringstream.cpp:34:14:34:19 | call to source |
| stringstream.cpp:38:7:38:9 | Argument 0 indirection | stringstream.cpp:32:14:32:19 | call to source |
| stringstream.cpp:40:7:40:9 | Argument 0 indirection | stringstream.cpp:34:14:34:19 | call to source |
| stringstream.cpp:43:7:43:15 | Argument 0 indirection | stringstream.cpp:32:14:32:19 | call to source |
| stringstream.cpp:43:11:43:13 | call to str | stringstream.cpp:32:14:32:19 | call to source |
| stringstream.cpp:45:7:45:15 | Argument 0 indirection | stringstream.cpp:34:14:34:19 | call to source |
| stringstream.cpp:45:11:45:13 | call to str | stringstream.cpp:34:14:34:19 | call to source |
| stringstream.cpp:52:7:52:9 | Argument 0 indirection | stringstream.cpp:49:10:49:15 | call to source |
| stringstream.cpp:53:7:53:9 | Argument 0 indirection | stringstream.cpp:50:10:50:15 | call to source |
| stringstream.cpp:59:7:59:9 | Argument 0 indirection | stringstream.cpp:56:15:56:29 | call to source |
| stringstream.cpp:66:7:66:10 | Argument 0 indirection | stringstream.cpp:63:18:63:23 | call to source |
| stringstream.cpp:81:7:81:9 | Argument 0 indirection | stringstream.cpp:70:32:70:37 | source |
| stringstream.cpp:83:7:83:15 | Argument 0 indirection | stringstream.cpp:70:32:70:37 | source |
| stringstream.cpp:83:11:83:13 | call to str | stringstream.cpp:70:32:70:37 | source |
| stringstream.cpp:85:7:85:8 | v2 | stringstream.cpp:70:32:70:37 | source |
| stringstream.cpp:103:7:103:9 | Argument 0 indirection | stringstream.cpp:91:19:91:24 | call to source |
@@ -274,10 +419,15 @@
| stringstream.cpp:143:11:143:22 | (reference dereference) | stringstream.cpp:143:14:143:19 | call to source |
| stringstream.cpp:149:7:149:8 | Argument 0 indirection | stringstream.cpp:143:14:143:19 | call to source |
| stringstream.cpp:150:7:150:8 | Argument 0 indirection | stringstream.cpp:143:14:143:19 | call to source |
| stringstream.cpp:157:7:157:8 | Argument 0 indirection | stringstream.cpp:143:14:143:19 | call to source |
| stringstream.cpp:157:7:157:8 | call to basic_string | stringstream.cpp:143:14:143:19 | call to source |
| stringstream.cpp:158:7:158:8 | Argument 0 indirection | stringstream.cpp:143:14:143:19 | call to source |
| stringstream.cpp:158:7:158:8 | call to basic_string | stringstream.cpp:143:14:143:19 | call to source |
| stringstream.cpp:168:7:168:8 | Argument 0 indirection | stringstream.cpp:143:14:143:19 | call to source |
| stringstream.cpp:168:7:168:8 | call to basic_string | stringstream.cpp:143:14:143:19 | call to source |
| stringstream.cpp:170:7:170:8 | Argument 0 indirection | stringstream.cpp:143:14:143:19 | call to source |
| stringstream.cpp:170:7:170:8 | call to basic_string | stringstream.cpp:143:14:143:19 | call to source |
| stringstream.cpp:172:7:172:9 | Argument 0 indirection | stringstream.cpp:143:14:143:19 | call to source |
| stringstream.cpp:172:7:172:9 | call to basic_string | stringstream.cpp:143:14:143:19 | call to source |
| stringstream.cpp:175:7:175:20 | ... = ... | stringstream.cpp:143:14:143:19 | call to source |
| stringstream.cpp:177:7:177:21 | ... = ... | stringstream.cpp:143:14:143:19 | call to source |
@@ -285,16 +435,22 @@
| stringstream.cpp:183:7:183:8 | c4 | stringstream.cpp:143:14:143:19 | call to source |
| stringstream.cpp:185:7:185:8 | c6 | stringstream.cpp:143:14:143:19 | call to source |
| stringstream.cpp:197:10:197:12 | call to get | stringstream.cpp:196:18:196:32 | call to source |
| stringstream.cpp:219:7:219:8 | Argument 0 indirection | stringstream.cpp:203:24:203:29 | call to source |
| stringstream.cpp:219:7:219:8 | call to basic_string | stringstream.cpp:203:24:203:29 | call to source |
| stringstream.cpp:220:7:220:8 | Argument 0 indirection | stringstream.cpp:203:24:203:29 | call to source |
| stringstream.cpp:220:7:220:8 | call to basic_string | stringstream.cpp:203:24:203:29 | call to source |
| stringstream.cpp:227:7:227:8 | Argument 0 indirection | stringstream.cpp:203:24:203:29 | call to source |
| stringstream.cpp:227:7:227:8 | call to basic_string | stringstream.cpp:203:24:203:29 | call to source |
| stringstream.cpp:228:7:228:8 | Argument 0 indirection | stringstream.cpp:203:24:203:29 | call to source |
| stringstream.cpp:228:7:228:8 | call to basic_string | stringstream.cpp:203:24:203:29 | call to source |
| stringstream.cpp:231:7:231:8 | Argument 0 indirection | stringstream.cpp:203:24:203:29 | call to source |
| stringstream.cpp:231:7:231:8 | call to basic_string | stringstream.cpp:203:24:203:29 | call to source |
| stringstream.cpp:239:7:239:8 | Argument 0 indirection | stringstream.cpp:203:24:203:29 | call to source |
| stringstream.cpp:240:7:240:8 | Argument 0 indirection | stringstream.cpp:203:24:203:29 | call to source |
| stringstream.cpp:247:7:247:8 | Argument 0 indirection | stringstream.cpp:203:24:203:29 | call to source |
| stringstream.cpp:248:7:248:8 | Argument 0 indirection | stringstream.cpp:203:24:203:29 | call to source |
| stringstream.cpp:251:7:251:8 | Argument 0 indirection | stringstream.cpp:203:24:203:29 | call to source |
| stringstream.cpp:263:7:263:8 | Argument 0 indirection | stringstream.cpp:257:24:257:29 | call to source |
| stringstream.cpp:263:7:263:8 | call to basic_string | stringstream.cpp:257:24:257:29 | call to source |
| structlikeclass.cpp:35:8:35:9 | s1 | structlikeclass.cpp:29:22:29:27 | call to source |
| structlikeclass.cpp:36:8:36:9 | s2 | structlikeclass.cpp:30:24:30:29 | call to source |
@@ -307,6 +463,7 @@
| swap1.cpp:78:12:78:16 | data1 | swap1.cpp:71:15:71:20 | call to source |
| swap1.cpp:79:12:79:16 | data1 | swap1.cpp:71:15:71:20 | call to source |
| swap1.cpp:83:13:83:17 | data1 | swap1.cpp:82:16:82:21 | call to source |
| swap1.cpp:87:13:87:17 | data1 | swap1.cpp:82:16:82:21 | call to source |
| swap1.cpp:88:13:88:17 | data1 | swap1.cpp:82:16:82:21 | call to source |
| swap1.cpp:97:12:97:16 | data1 | swap1.cpp:95:15:95:20 | call to source |
| swap1.cpp:102:12:102:16 | data1 | swap1.cpp:95:15:95:20 | call to source |
@@ -323,6 +480,7 @@
| swap2.cpp:78:12:78:16 | data1 | swap2.cpp:71:15:71:20 | call to source |
| swap2.cpp:79:12:79:16 | data1 | swap2.cpp:71:15:71:20 | call to source |
| swap2.cpp:83:13:83:17 | data1 | swap2.cpp:82:16:82:21 | call to source |
| swap2.cpp:87:13:87:17 | data1 | swap2.cpp:82:16:82:21 | call to source |
| swap2.cpp:88:13:88:17 | data1 | swap2.cpp:82:16:82:21 | call to source |
| swap2.cpp:97:12:97:16 | data1 | swap2.cpp:95:15:95:20 | call to source |
| swap2.cpp:102:12:102:16 | data1 | swap2.cpp:95:15:95:20 | call to source |
@@ -408,6 +566,7 @@
| vector.cpp:258:8:258:9 | Argument 0 indirection | vector.cpp:239:15:239:20 | call to source |
| vector.cpp:259:8:259:9 | Argument 0 indirection | vector.cpp:239:15:239:20 | call to source |
| vector.cpp:260:8:260:9 | Argument 0 indirection | vector.cpp:239:15:239:20 | call to source |
| vector.cpp:261:8:261:9 | Argument 0 indirection | vector.cpp:239:15:239:20 | call to source |
| vector.cpp:273:8:273:9 | Argument 0 indirection | vector.cpp:269:18:269:31 | call to source |
| vector.cpp:274:8:274:9 | Argument 0 indirection | vector.cpp:270:18:270:35 | call to source |
| vector.cpp:275:8:275:9 | Argument 0 indirection | vector.cpp:271:18:271:34 | call to source |

View File

@@ -0,0 +1,35 @@
template<class T>
struct remove_const { typedef T type; };
template<class T>
struct remove_const<const T> { typedef T type; };
// `remove_const_t<T>` removes any `const` specifier from `T`
template<class T>
using remove_const_t = typename remove_const<T>::type;
template<class T>
struct remove_reference { typedef T type; };
template<class T>
struct remove_reference<T &> { typedef T type; };
template<class T>
struct remove_reference<T &&> { typedef T type; };
// `remove_reference_t<T>` removes any `&` from `T`
template<class T>
using remove_reference_t = typename remove_reference<T>::type;
template<class T>
struct decay_impl {
typedef T type;
};
template<class T, size_t t_size>
struct decay_impl<T[t_size]> {
typedef T* type;
};
template<class T>
using decay_t = typename decay_impl<remove_reference_t<T>>::type;

View File

@@ -312,7 +312,7 @@ void test_vector_insert() {
sink(d); // tainted
}
void test_constructors_more() {
void test_vector_constructors_more() {
std::vector<int> v1;
std::vector<int> v2;
v2.push_back(source());

View File

@@ -13,3 +13,4 @@
| test.cpp:42:11:42:11 | x |
| test.cpp:57:9:57:9 | 4 |
| test.cpp:63:9:63:19 | call to getAVirtual |
| test.cpp:63:9:63:21 | temporary object |

View File

@@ -6014,6 +6014,9 @@ ir.cpp:
# 716| Type = [TemplateParameter] T
# 716| Value = [Literal] 0
# 716| ValueCategory = prvalue
# 716| getExpr().getFullyConverted(): [TemporaryObjectExpr] temporary object
# 716| Type = [TemplateParameter] T
# 716| ValueCategory = prvalue(load)
# 715| [MemberFunction,TemplateFunction] long Outer<long>::Func<U, V>(U, V)
# 715| <params>:
# 715| getParameter(0): [Parameter] x
@@ -6032,6 +6035,9 @@ ir.cpp:
# 716| Type = [LongType] long
# 716| Value = [Literal] 0
# 716| ValueCategory = prvalue
# 716| getExpr().getFullyConverted(): [TemporaryObjectExpr] temporary object
# 716| Type = [LongType] long
# 716| ValueCategory = prvalue(load)
# 720| [TopLevelFunction] double CallNestedTemplateFunc()
# 720| <params>:
# 720| getEntryPoint(): [BlockStmt] { ... }
@@ -6694,6 +6700,9 @@ ir.cpp:
# 809| Conversion = [GlvalueConversion] glvalue conversion
# 809| Type = [SpecifiedType] const Base
# 809| ValueCategory = lvalue
# 809| getExpr(): [TemporaryObjectExpr] temporary object
# 809| Type = [Struct,VirtualBaseClass] Base
# 809| ValueCategory = lvalue
# 809| getExpr().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference)
# 809| Type = [Struct,VirtualBaseClass] Base
# 809| ValueCategory = lvalue
@@ -6724,6 +6733,9 @@ ir.cpp:
# 810| Conversion = [GlvalueConversion] glvalue conversion
# 810| Type = [SpecifiedType] const Base
# 810| ValueCategory = lvalue
# 810| getExpr(): [TemporaryObjectExpr] temporary object
# 810| Type = [Struct,VirtualBaseClass] Base
# 810| ValueCategory = lvalue
# 810| getExpr().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference)
# 810| Type = [Struct,VirtualBaseClass] Base
# 810| ValueCategory = lvalue
@@ -6928,6 +6940,9 @@ ir.cpp:
# 823| Conversion = [GlvalueConversion] glvalue conversion
# 823| Type = [SpecifiedType] const Base
# 823| ValueCategory = lvalue
# 823| getExpr(): [TemporaryObjectExpr] temporary object
# 823| Type = [Struct,VirtualBaseClass] Base
# 823| ValueCategory = lvalue
# 823| getExpr().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference)
# 823| Type = [Struct,VirtualBaseClass] Base
# 823| ValueCategory = lvalue
@@ -6962,6 +6977,9 @@ ir.cpp:
# 824| Conversion = [GlvalueConversion] glvalue conversion
# 824| Type = [SpecifiedType] const Base
# 824| ValueCategory = lvalue
# 824| getExpr(): [TemporaryObjectExpr] temporary object
# 824| Type = [Struct,VirtualBaseClass] Base
# 824| ValueCategory = lvalue
# 824| getExpr().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference)
# 824| Type = [Struct,VirtualBaseClass] Base
# 824| ValueCategory = lvalue
@@ -7248,16 +7266,16 @@ ir.cpp:
# 850| getDeclarationEntry(0): [VariableDeclarationEntry] definition of b
# 850| Type = [Struct] PolymorphicBase
# 850| getVariable().getInitializer(): [Initializer] initializer for b
#-----| getExpr(): [ConstructorCall] call to PolymorphicBase
#-----| Type = [VoidType] void
#-----| ValueCategory = prvalue
# 850| getExpr(): [ConstructorCall] call to PolymorphicBase
# 850| Type = [VoidType] void
# 850| ValueCategory = prvalue
# 851| getStmt(1): [DeclStmt] declaration
# 851| getDeclarationEntry(0): [VariableDeclarationEntry] definition of d
# 851| Type = [Struct] PolymorphicDerived
# 851| getVariable().getInitializer(): [Initializer] initializer for d
#-----| getExpr(): [ConstructorCall] call to PolymorphicDerived
#-----| Type = [VoidType] void
#-----| ValueCategory = prvalue
# 851| getExpr(): [ConstructorCall] call to PolymorphicDerived
# 851| Type = [VoidType] void
# 851| ValueCategory = prvalue
# 853| getStmt(2): [DeclStmt] declaration
# 853| getDeclarationEntry(0): [VariableDeclarationEntry] definition of pb
# 853| Type = [PointerType] PolymorphicBase *
@@ -9677,7 +9695,7 @@ ir.cpp:
# 1178| getEntryPoint(): [BlockStmt] { ... }
# 1179| getStmt(0): [ReturnStmt] return ...
# 1179| getExpr(): [ConstructorCall] call to String
# 1179| Type = [Struct] String
# 1179| Type = [VoidType] void
# 1179| ValueCategory = prvalue
# 1179| getArgument(0): foo
# 1179| Type = [ArrayType] const char[4]
@@ -10555,6 +10573,752 @@ ir.cpp:
# 1322| Type = [VoidPointerType] void *
# 1322| ValueCategory = prvalue
# 1323| getStmt(1): [ReturnStmt] return ...
# 1326| [FunctionTemplateInstantiation,TopLevelFunction] Point defaultConstruct<Point>()
# 1326| <params>:
# 1326| getEntryPoint(): [BlockStmt] { ... }
# 1327| getStmt(0): [ReturnStmt] return ...
# 1327| getExpr(): [Literal] 0
# 1327| Type = [Struct] Point
# 1327| Value = [Literal] 0
# 1327| ValueCategory = prvalue
# 1326| [FunctionTemplateInstantiation,TopLevelFunction] String defaultConstruct<String>()
# 1326| <params>:
# 1326| getEntryPoint(): [BlockStmt] { ... }
# 1327| getStmt(0): [ReturnStmt] return ...
# 1327| getExpr(): [ConstructorCall] call to String
# 1327| Type = [VoidType] void
# 1327| ValueCategory = prvalue
# 1326| [TemplateFunction,TopLevelFunction] T defaultConstruct<T>()
# 1326| <params>:
# 1326| getEntryPoint(): [BlockStmt] { ... }
# 1327| getStmt(0): [ReturnStmt] return ...
# 1327| getExpr(): [Literal] 0
# 1327| Type = [TemplateParameter] T
# 1327| Value = [Literal] 0
# 1327| ValueCategory = prvalue
# 1327| getExpr().getFullyConverted(): [TemporaryObjectExpr] temporary object
# 1327| Type = [TemplateParameter] T
# 1327| ValueCategory = prvalue(load)
# 1326| [FunctionTemplateInstantiation,TopLevelFunction] copy_constructor defaultConstruct<copy_constructor>()
# 1326| <params>:
# 1326| getEntryPoint(): [BlockStmt] { ... }
# 1327| getStmt(0): [ReturnStmt] return ...
# 1327| getExpr(): [ConstructorCall] call to copy_constructor
# 1327| Type = [VoidType] void
# 1327| ValueCategory = prvalue
# 1326| [FunctionTemplateInstantiation,TopLevelFunction] destructor_only defaultConstruct<destructor_only>()
# 1326| <params>:
# 1326| getEntryPoint(): [BlockStmt] { ... }
# 1327| getStmt(0): [ReturnStmt] return ...
# 1327| getExpr(): [Literal] 0
# 1327| Type = [Class] destructor_only
# 1327| Value = [Literal] 0
# 1327| ValueCategory = prvalue
# 1330| [CopyAssignmentOperator] constructor_only& constructor_only::operator=(constructor_only const&)
# 1330| <params>:
#-----| getParameter(0): [Parameter] (unnamed parameter 0)
#-----| Type = [LValueReferenceType] const constructor_only &
# 1330| [MoveAssignmentOperator] constructor_only& constructor_only::operator=(constructor_only&&)
# 1330| <params>:
#-----| getParameter(0): [Parameter] (unnamed parameter 0)
#-----| Type = [RValueReferenceType] constructor_only &&
# 1330| [CopyConstructor] void constructor_only::constructor_only(constructor_only const&)
# 1330| <params>:
#-----| getParameter(0): [Parameter] (unnamed parameter 0)
#-----| Type = [LValueReferenceType] const constructor_only &
# 1330| [MoveConstructor] void constructor_only::constructor_only(constructor_only&&)
# 1330| <params>:
#-----| getParameter(0): [Parameter] (unnamed parameter 0)
#-----| Type = [RValueReferenceType] constructor_only &&
# 1335| [ConversionConstructor] void constructor_only::constructor_only(int)
# 1335| <params>:
# 1335| getParameter(0): [Parameter] x
# 1335| Type = [IntType] int
# 1338| [CopyAssignmentOperator] copy_constructor& copy_constructor::operator=(copy_constructor const&)
# 1338| <params>:
#-----| getParameter(0): [Parameter] (unnamed parameter 0)
#-----| Type = [LValueReferenceType] const copy_constructor &
# 1343| [Constructor] void copy_constructor::copy_constructor()
# 1343| <params>:
# 1344| [CopyConstructor] void copy_constructor::copy_constructor(copy_constructor const&)
# 1344| <params>:
# 1344| getParameter(0): [Parameter] (unnamed parameter 0)
# 1344| Type = [LValueReferenceType] const copy_constructor &
# 1346| [MemberFunction] void copy_constructor::method()
# 1346| <params>:
# 1349| [CopyAssignmentOperator] destructor_only& destructor_only::operator=(destructor_only const&)
# 1349| <params>:
#-----| getParameter(0): [Parameter] (unnamed parameter 0)
#-----| Type = [LValueReferenceType] const destructor_only &
# 1349| [Constructor] void destructor_only::destructor_only()
# 1349| <params>:
# 1351| [Destructor] void destructor_only::~destructor_only()
# 1351| <params>:
# 1353| [MemberFunction] void destructor_only::method()
# 1353| <params>:
# 1357| [FunctionTemplateInstantiation,TopLevelFunction] void acceptRef<Point>(Point const&)
# 1357| <params>:
# 1357| getParameter(0): [Parameter] v
# 1357| Type = [LValueReferenceType] const Point &
# 1357| [FunctionTemplateInstantiation,TopLevelFunction] void acceptRef<String>(String const&)
# 1357| <params>:
# 1357| getParameter(0): [Parameter] v
# 1357| Type = [LValueReferenceType] const String &
# 1357| [TemplateFunction,TopLevelFunction] void acceptRef<T>(T const&)
# 1357| <params>:
# 1357| getParameter(0): [Parameter] v
# 1357| Type = [LValueReferenceType] const T &
# 1357| [FunctionTemplateInstantiation,TopLevelFunction] void acceptRef<copy_constructor>(copy_constructor const&)
# 1357| <params>:
# 1357| getParameter(0): [Parameter] v
# 1357| Type = [LValueReferenceType] const copy_constructor &
# 1357| [FunctionTemplateInstantiation,TopLevelFunction] void acceptRef<destructor_only>(destructor_only const&)
# 1357| <params>:
# 1357| getParameter(0): [Parameter] v
# 1357| Type = [LValueReferenceType] const destructor_only &
# 1360| [FunctionTemplateInstantiation,TopLevelFunction] void acceptValue<Point>(Point)
# 1360| <params>:
# 1360| getParameter(0): [Parameter] v
# 1360| Type = [Struct] Point
# 1360| [FunctionTemplateInstantiation,TopLevelFunction] void acceptValue<String>(String)
# 1360| <params>:
# 1360| getParameter(0): [Parameter] v
# 1360| Type = [Struct] String
# 1360| [TemplateFunction,TopLevelFunction] void acceptValue<T>(T)
# 1360| <params>:
# 1360| getParameter(0): [Parameter] v
# 1360| Type = [TemplateParameter] T
# 1360| [FunctionTemplateInstantiation,TopLevelFunction] void acceptValue<copy_constructor>(copy_constructor)
# 1360| <params>:
# 1360| getParameter(0): [Parameter] v
# 1360| Type = [Class] copy_constructor
# 1360| [FunctionTemplateInstantiation,TopLevelFunction] void acceptValue<destructor_only>(destructor_only)
# 1360| <params>:
# 1360| getParameter(0): [Parameter] v
# 1360| Type = [Class] destructor_only
# 1363| [FunctionTemplateInstantiation,TopLevelFunction] POD_Derived returnValue<POD_Derived>()
# 1363| <params>:
# 1363| [FunctionTemplateInstantiation,TopLevelFunction] POD_Middle returnValue<POD_Middle>()
# 1363| <params>:
# 1363| [FunctionTemplateInstantiation,TopLevelFunction] Point returnValue<Point>()
# 1363| <params>:
# 1363| [FunctionTemplateInstantiation,TopLevelFunction] String returnValue<String>()
# 1363| <params>:
# 1363| [TemplateFunction,TopLevelFunction] T returnValue<T>()
# 1363| <params>:
# 1363| [FunctionTemplateInstantiation,TopLevelFunction] UnusualFields returnValue<UnusualFields>()
# 1363| <params>:
# 1363| [FunctionTemplateInstantiation,TopLevelFunction] copy_constructor returnValue<copy_constructor>()
# 1363| <params>:
# 1363| [FunctionTemplateInstantiation,TopLevelFunction] destructor_only returnValue<destructor_only>()
# 1363| <params>:
# 1365| [TopLevelFunction] void temporary_string()
# 1365| <params>:
# 1365| getEntryPoint(): [BlockStmt] { ... }
# 1366| getStmt(0): [DeclStmt] declaration
# 1366| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s
# 1366| Type = [Struct] String
# 1366| getVariable().getInitializer(): [Initializer] initializer for s
# 1366| getExpr(): [FunctionCall] call to returnValue
# 1366| Type = [Struct] String
# 1366| ValueCategory = prvalue
# 1367| getStmt(1): [DeclStmt] declaration
# 1367| getDeclarationEntry(0): [VariableDeclarationEntry] definition of rs
# 1367| Type = [LValueReferenceType] const String &
# 1367| getVariable().getInitializer(): [Initializer] initializer for rs
# 1367| getExpr(): [FunctionCall] call to returnValue
# 1367| Type = [Struct] String
# 1367| ValueCategory = prvalue
# 1367| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to)
# 1367| Type = [LValueReferenceType] const String &
# 1367| ValueCategory = prvalue
# 1367| getExpr(): [CStyleCast] (const String)...
# 1367| Conversion = [GlvalueConversion] glvalue conversion
# 1367| Type = [SpecifiedType] const String
# 1367| ValueCategory = lvalue
# 1367| getExpr(): [TemporaryObjectExpr] temporary object
# 1367| Type = [Struct] String
# 1367| ValueCategory = lvalue
# 1369| getStmt(2): [ExprStmt] ExprStmt
# 1369| getExpr(): [FunctionCall] call to acceptRef
# 1369| Type = [VoidType] void
# 1369| ValueCategory = prvalue
# 1369| getArgument(0): [VariableAccess] s
# 1369| Type = [Struct] String
# 1369| ValueCategory = lvalue
# 1369| getArgument(0).getFullyConverted(): [ReferenceToExpr] (reference to)
# 1369| Type = [LValueReferenceType] const String &
# 1369| ValueCategory = prvalue
# 1369| getExpr(): [CStyleCast] (const String)...
# 1369| Conversion = [GlvalueConversion] glvalue conversion
# 1369| Type = [SpecifiedType] const String
# 1369| ValueCategory = lvalue
# 1370| getStmt(3): [ExprStmt] ExprStmt
# 1370| getExpr(): [FunctionCall] call to acceptRef
# 1370| Type = [VoidType] void
# 1370| ValueCategory = prvalue
# 1370| getArgument(0): [ConstructorCall] call to String
# 1370| Type = [VoidType] void
# 1370| ValueCategory = prvalue
# 1370| getArgument(0): foo
# 1370| Type = [ArrayType] const char[4]
# 1370| Value = [StringLiteral] "foo"
# 1370| ValueCategory = lvalue
# 1370| getArgument(0).getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion
# 1370| Type = [PointerType] const char *
# 1370| ValueCategory = prvalue
# 1370| getArgument(0).getFullyConverted(): [ReferenceToExpr] (reference to)
# 1370| Type = [LValueReferenceType] const String &
# 1370| ValueCategory = prvalue
# 1370| getExpr(): [TemporaryObjectExpr] temporary object
# 1370| Type = [SpecifiedType] const String
# 1370| ValueCategory = lvalue
# 1371| getStmt(4): [ExprStmt] ExprStmt
# 1371| getExpr(): [FunctionCall] call to acceptValue
# 1371| Type = [VoidType] void
# 1371| ValueCategory = prvalue
# 1371| getArgument(0): [ConstructorCall] call to String
# 1371| Type = [VoidType] void
# 1371| ValueCategory = prvalue
# 1371| getArgument(0): [VariableAccess] s
# 1371| Type = [Struct] String
# 1371| ValueCategory = lvalue
# 1371| getArgument(0).getFullyConverted(): [ReferenceToExpr] (reference to)
# 1371| Type = [LValueReferenceType] const String &
# 1371| ValueCategory = prvalue
# 1371| getExpr(): [CStyleCast] (const String)...
# 1371| Conversion = [GlvalueConversion] glvalue conversion
# 1371| Type = [SpecifiedType] const String
# 1371| ValueCategory = lvalue
# 1371| getArgument(0).getFullyConverted(): [TemporaryObjectExpr] temporary object
# 1371| Type = [Struct] String
# 1371| ValueCategory = lvalue
# 1372| getStmt(5): [ExprStmt] ExprStmt
# 1372| getExpr(): [FunctionCall] call to acceptValue
# 1372| Type = [VoidType] void
# 1372| ValueCategory = prvalue
# 1372| getArgument(0): [ConstructorCall] call to String
# 1372| Type = [VoidType] void
# 1372| ValueCategory = prvalue
# 1372| getArgument(0): foo
# 1372| Type = [ArrayType] const char[4]
# 1372| Value = [StringLiteral] "foo"
# 1372| ValueCategory = lvalue
# 1372| getArgument(0).getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion
# 1372| Type = [PointerType] const char *
# 1372| ValueCategory = prvalue
# 1372| getArgument(0).getFullyConverted(): [TemporaryObjectExpr] temporary object
# 1372| Type = [Struct] String
# 1372| ValueCategory = lvalue
# 1373| getStmt(6): [ExprStmt] ExprStmt
# 1373| getExpr(): [FunctionCall] call to c_str
# 1373| Type = [PointerType] const char *
# 1373| ValueCategory = prvalue
# 1373| getQualifier(): [ConstructorCall] call to String
# 1373| Type = [VoidType] void
# 1373| ValueCategory = prvalue
# 1373| getQualifier().getFullyConverted(): [CStyleCast] (const String)...
# 1373| Conversion = [PrvalueAdjustmentConversion] prvalue adjustment conversion
# 1373| Type = [SpecifiedType] const String
# 1373| ValueCategory = prvalue
# 1373| getExpr(): [TemporaryObjectExpr] temporary object
# 1373| Type = [Struct] String
# 1373| ValueCategory = prvalue(load)
# 1374| getStmt(7): [ExprStmt] ExprStmt
# 1374| getExpr(): [FunctionCall] call to c_str
# 1374| Type = [PointerType] const char *
# 1374| ValueCategory = prvalue
# 1374| getQualifier(): [FunctionCall] call to returnValue
# 1374| Type = [Struct] String
# 1374| ValueCategory = prvalue
# 1374| getQualifier().getFullyConverted(): [CStyleCast] (const String)...
# 1374| Conversion = [PrvalueAdjustmentConversion] prvalue adjustment conversion
# 1374| Type = [SpecifiedType] const String
# 1374| ValueCategory = prvalue
# 1374| getExpr(): [TemporaryObjectExpr] temporary object
# 1374| Type = [Struct] String
# 1374| ValueCategory = prvalue(load)
# 1376| getStmt(8): [ExprStmt] ExprStmt
# 1376| getExpr(): [FunctionCall] call to defaultConstruct
# 1376| Type = [Struct] String
# 1376| ValueCategory = prvalue
# 1376| getExpr().getFullyConverted(): [TemporaryObjectExpr] temporary object
# 1376| Type = [Struct] String
# 1376| ValueCategory = prvalue(load)
# 1377| getStmt(9): [ReturnStmt] return ...
# 1379| [TopLevelFunction] void temporary_destructor_only()
# 1379| <params>:
# 1379| getEntryPoint(): [BlockStmt] { ... }
# 1380| getStmt(0): [DeclStmt] declaration
# 1380| getDeclarationEntry(0): [VariableDeclarationEntry] definition of d
# 1380| Type = [Class] destructor_only
# 1380| getVariable().getInitializer(): [Initializer] initializer for d
# 1380| getExpr(): [FunctionCall] call to returnValue
# 1380| Type = [Class] destructor_only
# 1380| ValueCategory = prvalue
# 1381| getStmt(1): [DeclStmt] declaration
# 1381| getDeclarationEntry(0): [VariableDeclarationEntry] definition of rd
# 1381| Type = [LValueReferenceType] const destructor_only &
# 1381| getVariable().getInitializer(): [Initializer] initializer for rd
# 1381| getExpr(): [FunctionCall] call to returnValue
# 1381| Type = [Class] destructor_only
# 1381| ValueCategory = prvalue
# 1381| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to)
# 1381| Type = [LValueReferenceType] const destructor_only &
# 1381| ValueCategory = prvalue
# 1381| getExpr(): [CStyleCast] (const destructor_only)...
# 1381| Conversion = [GlvalueConversion] glvalue conversion
# 1381| Type = [SpecifiedType] const destructor_only
# 1381| ValueCategory = lvalue
# 1381| getExpr(): [TemporaryObjectExpr] temporary object
# 1381| Type = [Class] destructor_only
# 1381| ValueCategory = lvalue
# 1382| getStmt(2): [DeclStmt] declaration
# 1382| getDeclarationEntry(0): [VariableDeclarationEntry] definition of d2
# 1382| Type = [Class] destructor_only
# 1383| getStmt(3): [ExprStmt] ExprStmt
# 1383| getExpr(): [FunctionCall] call to acceptRef
# 1383| Type = [VoidType] void
# 1383| ValueCategory = prvalue
# 1383| getArgument(0): [VariableAccess] d
# 1383| Type = [Class] destructor_only
# 1383| ValueCategory = lvalue
# 1383| getArgument(0).getFullyConverted(): [ReferenceToExpr] (reference to)
# 1383| Type = [LValueReferenceType] const destructor_only &
# 1383| ValueCategory = prvalue
# 1383| getExpr(): [CStyleCast] (const destructor_only)...
# 1383| Conversion = [GlvalueConversion] glvalue conversion
# 1383| Type = [SpecifiedType] const destructor_only
# 1383| ValueCategory = lvalue
# 1384| getStmt(4): [ExprStmt] ExprStmt
# 1384| getExpr(): [FunctionCall] call to acceptValue
# 1384| Type = [VoidType] void
# 1384| ValueCategory = prvalue
# 1384| getArgument(0): [VariableAccess] d
# 1384| Type = [Class] destructor_only
# 1384| ValueCategory = prvalue(load)
# 1384| getArgument(0).getFullyConverted(): [TemporaryObjectExpr] temporary object
# 1384| Type = [Class] destructor_only
# 1384| ValueCategory = lvalue
# 1385| getStmt(5): [ExprStmt] ExprStmt
# 1385| getExpr(): [FunctionCall] call to method
# 1385| Type = [VoidType] void
# 1385| ValueCategory = prvalue
# 1385| getQualifier(): [Literal] 0
# 1385| Type = [Class] destructor_only
# 1385| Value = [Literal] 0
# 1385| ValueCategory = prvalue
# 1385| getQualifier().getFullyConverted(): [TemporaryObjectExpr] temporary object
# 1385| Type = [Class] destructor_only
# 1385| ValueCategory = prvalue(load)
# 1386| getStmt(6): [ExprStmt] ExprStmt
# 1386| getExpr(): [FunctionCall] call to method
# 1386| Type = [VoidType] void
# 1386| ValueCategory = prvalue
# 1386| getQualifier(): [FunctionCall] call to returnValue
# 1386| Type = [Class] destructor_only
# 1386| ValueCategory = prvalue
# 1386| getQualifier().getFullyConverted(): [TemporaryObjectExpr] temporary object
# 1386| Type = [Class] destructor_only
# 1386| ValueCategory = prvalue(load)
# 1388| getStmt(7): [ExprStmt] ExprStmt
# 1388| getExpr(): [FunctionCall] call to defaultConstruct
# 1388| Type = [Class] destructor_only
# 1388| ValueCategory = prvalue
# 1388| getExpr().getFullyConverted(): [TemporaryObjectExpr] temporary object
# 1388| Type = [Class] destructor_only
# 1388| ValueCategory = prvalue(load)
# 1389| getStmt(8): [ReturnStmt] return ...
# 1391| [TopLevelFunction] void temporary_copy_constructor()
# 1391| <params>:
# 1391| getEntryPoint(): [BlockStmt] { ... }
# 1392| getStmt(0): [DeclStmt] declaration
# 1392| getDeclarationEntry(0): [VariableDeclarationEntry] definition of d
# 1392| Type = [Class] copy_constructor
# 1392| getVariable().getInitializer(): [Initializer] initializer for d
# 1392| getExpr(): [FunctionCall] call to returnValue
# 1392| Type = [Class] copy_constructor
# 1392| ValueCategory = prvalue
# 1393| getStmt(1): [DeclStmt] declaration
# 1393| getDeclarationEntry(0): [VariableDeclarationEntry] definition of rd
# 1393| Type = [LValueReferenceType] const copy_constructor &
# 1393| getVariable().getInitializer(): [Initializer] initializer for rd
# 1393| getExpr(): [FunctionCall] call to returnValue
# 1393| Type = [Class] copy_constructor
# 1393| ValueCategory = prvalue
# 1393| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to)
# 1393| Type = [LValueReferenceType] const copy_constructor &
# 1393| ValueCategory = prvalue
# 1393| getExpr(): [CStyleCast] (const copy_constructor)...
# 1393| Conversion = [GlvalueConversion] glvalue conversion
# 1393| Type = [SpecifiedType] const copy_constructor
# 1393| ValueCategory = lvalue
# 1393| getExpr(): [TemporaryObjectExpr] temporary object
# 1393| Type = [Class] copy_constructor
# 1393| ValueCategory = lvalue
# 1394| getStmt(2): [DeclStmt] declaration
# 1394| getDeclarationEntry(0): [VariableDeclarationEntry] definition of d2
# 1394| Type = [Class] copy_constructor
# 1394| getVariable().getInitializer(): [Initializer] initializer for d2
# 1394| getExpr(): [ConstructorCall] call to copy_constructor
# 1394| Type = [VoidType] void
# 1394| ValueCategory = prvalue
# 1395| getStmt(3): [ExprStmt] ExprStmt
# 1395| getExpr(): [FunctionCall] call to acceptRef
# 1395| Type = [VoidType] void
# 1395| ValueCategory = prvalue
# 1395| getArgument(0): [VariableAccess] d
# 1395| Type = [Class] copy_constructor
# 1395| ValueCategory = lvalue
# 1395| getArgument(0).getFullyConverted(): [ReferenceToExpr] (reference to)
# 1395| Type = [LValueReferenceType] const copy_constructor &
# 1395| ValueCategory = prvalue
# 1395| getExpr(): [CStyleCast] (const copy_constructor)...
# 1395| Conversion = [GlvalueConversion] glvalue conversion
# 1395| Type = [SpecifiedType] const copy_constructor
# 1395| ValueCategory = lvalue
# 1396| getStmt(4): [ExprStmt] ExprStmt
# 1396| getExpr(): [FunctionCall] call to acceptValue
# 1396| Type = [VoidType] void
# 1396| ValueCategory = prvalue
# 1396| getArgument(0): [ConstructorCall] call to copy_constructor
# 1396| Type = [VoidType] void
# 1396| ValueCategory = prvalue
# 1396| getArgument(0): [VariableAccess] d
# 1396| Type = [Class] copy_constructor
# 1396| ValueCategory = lvalue
# 1396| getArgument(0).getFullyConverted(): [ReferenceToExpr] (reference to)
# 1396| Type = [LValueReferenceType] const copy_constructor &
# 1396| ValueCategory = prvalue
# 1396| getExpr(): [CStyleCast] (const copy_constructor)...
# 1396| Conversion = [GlvalueConversion] glvalue conversion
# 1396| Type = [SpecifiedType] const copy_constructor
# 1396| ValueCategory = lvalue
# 1396| getArgument(0).getFullyConverted(): [TemporaryObjectExpr] temporary object
# 1396| Type = [Class] copy_constructor
# 1396| ValueCategory = lvalue
# 1397| getStmt(5): [ExprStmt] ExprStmt
# 1397| getExpr(): [FunctionCall] call to method
# 1397| Type = [VoidType] void
# 1397| ValueCategory = prvalue
# 1397| getQualifier(): [ConstructorCall] call to copy_constructor
# 1397| Type = [VoidType] void
# 1397| ValueCategory = prvalue
# 1397| getQualifier().getFullyConverted(): [TemporaryObjectExpr] temporary object
# 1397| Type = [Class] copy_constructor
# 1397| ValueCategory = prvalue(load)
# 1398| getStmt(6): [ExprStmt] ExprStmt
# 1398| getExpr(): [FunctionCall] call to method
# 1398| Type = [VoidType] void
# 1398| ValueCategory = prvalue
# 1398| getQualifier(): [FunctionCall] call to returnValue
# 1398| Type = [Class] copy_constructor
# 1398| ValueCategory = prvalue
# 1398| getQualifier().getFullyConverted(): [TemporaryObjectExpr] temporary object
# 1398| Type = [Class] copy_constructor
# 1398| ValueCategory = prvalue(load)
# 1399| getStmt(7): [ExprStmt] ExprStmt
# 1399| getExpr(): [FunctionCall] call to defaultConstruct
# 1399| Type = [Class] copy_constructor
# 1399| ValueCategory = prvalue
# 1399| getExpr().getFullyConverted(): [TemporaryObjectExpr] temporary object
# 1399| Type = [Class] copy_constructor
# 1399| ValueCategory = prvalue(load)
# 1401| getStmt(8): [DeclStmt] declaration
# 1401| getDeclarationEntry(0): [VariableDeclarationEntry] definition of y
# 1401| Type = [IntType] int
# 1401| getVariable().getInitializer(): [Initializer] initializer for y
# 1401| getExpr(): [ValueFieldAccess] y
# 1401| Type = [IntType] int
# 1401| ValueCategory = prvalue
# 1401| getQualifier(): [FunctionCall] call to returnValue
# 1401| Type = [Class] copy_constructor
# 1401| ValueCategory = prvalue
# 1401| getQualifier().getFullyConverted(): [TemporaryObjectExpr] temporary object
# 1401| Type = [Class] copy_constructor
# 1401| ValueCategory = prvalue(load)
# 1402| getStmt(9): [ReturnStmt] return ...
# 1404| [TopLevelFunction] void temporary_point()
# 1404| <params>:
# 1404| getEntryPoint(): [BlockStmt] { ... }
# 1405| getStmt(0): [DeclStmt] declaration
# 1405| getDeclarationEntry(0): [VariableDeclarationEntry] definition of p
# 1405| Type = [Struct] Point
# 1405| getVariable().getInitializer(): [Initializer] initializer for p
# 1405| getExpr(): [FunctionCall] call to returnValue
# 1405| Type = [Struct] Point
# 1405| ValueCategory = prvalue
# 1406| getStmt(1): [DeclStmt] declaration
# 1406| getDeclarationEntry(0): [VariableDeclarationEntry] definition of rp
# 1406| Type = [LValueReferenceType] const Point &
# 1406| getVariable().getInitializer(): [Initializer] initializer for rp
# 1406| getExpr(): [FunctionCall] call to returnValue
# 1406| Type = [Struct] Point
# 1406| ValueCategory = prvalue
# 1406| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to)
# 1406| Type = [LValueReferenceType] const Point &
# 1406| ValueCategory = prvalue
# 1406| getExpr(): [CStyleCast] (const Point)...
# 1406| Conversion = [GlvalueConversion] glvalue conversion
# 1406| Type = [SpecifiedType] const Point
# 1406| ValueCategory = lvalue
# 1406| getExpr(): [TemporaryObjectExpr] temporary object
# 1406| Type = [Struct] Point
# 1406| ValueCategory = lvalue
# 1408| getStmt(2): [ExprStmt] ExprStmt
# 1408| getExpr(): [FunctionCall] call to acceptRef
# 1408| Type = [VoidType] void
# 1408| ValueCategory = prvalue
# 1408| getArgument(0): [VariableAccess] p
# 1408| Type = [Struct] Point
# 1408| ValueCategory = lvalue
# 1408| getArgument(0).getFullyConverted(): [ReferenceToExpr] (reference to)
# 1408| Type = [LValueReferenceType] const Point &
# 1408| ValueCategory = prvalue
# 1408| getExpr(): [CStyleCast] (const Point)...
# 1408| Conversion = [GlvalueConversion] glvalue conversion
# 1408| Type = [SpecifiedType] const Point
# 1408| ValueCategory = lvalue
# 1409| getStmt(3): [ExprStmt] ExprStmt
# 1409| getExpr(): [FunctionCall] call to acceptValue
# 1409| Type = [VoidType] void
# 1409| ValueCategory = prvalue
# 1409| getArgument(0): [VariableAccess] p
# 1409| Type = [Struct] Point
# 1409| ValueCategory = prvalue(load)
# 1410| getStmt(4): [ExprStmt] ExprStmt
# 1410| getExpr(): [ValueFieldAccess] x
# 1410| Type = [IntType] int
# 1410| Value = [ValueFieldAccess] 0
# 1410| ValueCategory = prvalue
# 1410| getQualifier(): [Literal] 0
# 1410| Type = [Struct] Point
# 1410| Value = [Literal] 0
# 1410| ValueCategory = prvalue
# 1410| getQualifier().getFullyConverted(): [TemporaryObjectExpr] temporary object
# 1410| Type = [Struct] Point
# 1410| ValueCategory = prvalue(load)
# 1411| getStmt(5): [DeclStmt] declaration
# 1411| getDeclarationEntry(0): [VariableDeclarationEntry] definition of y
# 1411| Type = [IntType] int
# 1411| getVariable().getInitializer(): [Initializer] initializer for y
# 1411| getExpr(): [ValueFieldAccess] y
# 1411| Type = [IntType] int
# 1411| ValueCategory = prvalue
# 1411| getQualifier(): [FunctionCall] call to returnValue
# 1411| Type = [Struct] Point
# 1411| ValueCategory = prvalue
# 1413| getStmt(6): [ExprStmt] ExprStmt
# 1413| getExpr(): [FunctionCall] call to defaultConstruct
# 1413| Type = [Struct] Point
# 1413| ValueCategory = prvalue
# 1414| getStmt(7): [ReturnStmt] return ...
# 1416| [CopyAssignmentOperator] UnusualFields& UnusualFields::operator=(UnusualFields const&)
# 1416| <params>:
#-----| getParameter(0): [Parameter] (unnamed parameter 0)
#-----| Type = [LValueReferenceType] const UnusualFields &
# 1416| [Constructor] void UnusualFields::UnusualFields()
# 1416| <params>:
# 1416| [CopyConstructor] void UnusualFields::UnusualFields(UnusualFields const&)
# 1416| <params>:
#-----| getParameter(0): [Parameter] (unnamed parameter 0)
#-----| Type = [LValueReferenceType] const UnusualFields &
# 1416| [MoveConstructor] void UnusualFields::UnusualFields(UnusualFields&&)
# 1416| <params>:
#-----| getParameter(0): [Parameter] (unnamed parameter 0)
#-----| Type = [RValueReferenceType] UnusualFields &&
# 1421| [TopLevelFunction] void temporary_unusual_fields()
# 1421| <params>:
# 1421| getEntryPoint(): [BlockStmt] { ... }
# 1422| getStmt(0): [DeclStmt] declaration
# 1422| getDeclarationEntry(0): [VariableDeclarationEntry] definition of rx
# 1422| Type = [LValueReferenceType] const int &
# 1422| getVariable().getInitializer(): [Initializer] initializer for rx
# 1422| getExpr(): [ValueFieldAccess] r
# 1422| Type = [LValueReferenceType] int &
# 1422| ValueCategory = prvalue
# 1422| getQualifier(): [FunctionCall] call to returnValue
# 1422| Type = [Struct] UnusualFields
# 1422| ValueCategory = prvalue
# 1422| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to)
# 1422| Type = [LValueReferenceType] const int &
# 1422| ValueCategory = prvalue
# 1422| getExpr(): [CStyleCast] (const int)...
# 1422| Conversion = [GlvalueConversion] glvalue conversion
# 1422| Type = [SpecifiedType] const int
# 1422| ValueCategory = lvalue
# 1422| getExpr(): [ReferenceDereferenceExpr] (reference dereference)
# 1422| Type = [IntType] int
# 1422| ValueCategory = lvalue
# 1423| getStmt(1): [DeclStmt] declaration
# 1423| getDeclarationEntry(0): [VariableDeclarationEntry] definition of x
# 1423| Type = [IntType] int
# 1423| getVariable().getInitializer(): [Initializer] initializer for x
# 1423| getExpr(): [ValueFieldAccess] r
# 1423| Type = [LValueReferenceType] int &
# 1423| ValueCategory = prvalue
# 1423| getQualifier(): [FunctionCall] call to returnValue
# 1423| Type = [Struct] UnusualFields
# 1423| ValueCategory = prvalue
# 1423| getExpr().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference)
# 1423| Type = [IntType] int
# 1423| ValueCategory = prvalue(load)
# 1425| getStmt(2): [DeclStmt] declaration
# 1425| getDeclarationEntry(0): [VariableDeclarationEntry] definition of rf
# 1425| Type = [LValueReferenceType] const float &
# 1425| getVariable().getInitializer(): [Initializer] initializer for rf
# 1425| getExpr(): [ArrayExpr] access to array
# 1425| Type = [FloatType] float
# 1425| ValueCategory = lvalue
# 1425| getArrayBase(): [ValueFieldAccess] a
# 1425| Type = [ArrayType] float[10]
# 1425| ValueCategory = prvalue
# 1425| getQualifier(): [FunctionCall] call to returnValue
# 1425| Type = [Struct] UnusualFields
# 1425| ValueCategory = prvalue
# 1425| getArrayOffset(): [Literal] 3
# 1425| Type = [IntType] int
# 1425| Value = [Literal] 3
# 1425| ValueCategory = prvalue
# 1425| getArrayBase().getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion
# 1425| Type = [PointerType] float *
# 1425| ValueCategory = prvalue
# 1425| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to)
# 1425| Type = [LValueReferenceType] const float &
# 1425| ValueCategory = prvalue
# 1425| getExpr(): [CStyleCast] (const float)...
# 1425| Conversion = [GlvalueConversion] glvalue conversion
# 1425| Type = [SpecifiedType] const float
# 1425| ValueCategory = lvalue
# 1426| getStmt(3): [DeclStmt] declaration
# 1426| getDeclarationEntry(0): [VariableDeclarationEntry] definition of f
# 1426| Type = [FloatType] float
# 1426| getVariable().getInitializer(): [Initializer] initializer for f
# 1426| getExpr(): [ArrayExpr] access to array
# 1426| Type = [FloatType] float
# 1426| ValueCategory = prvalue(load)
# 1426| getArrayBase(): [ValueFieldAccess] a
# 1426| Type = [ArrayType] float[10]
# 1426| ValueCategory = prvalue
# 1426| getQualifier(): [FunctionCall] call to returnValue
# 1426| Type = [Struct] UnusualFields
# 1426| ValueCategory = prvalue
# 1426| getArrayOffset(): [Literal] 5
# 1426| Type = [IntType] int
# 1426| Value = [Literal] 5
# 1426| ValueCategory = prvalue
# 1426| getArrayBase().getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion
# 1426| Type = [PointerType] float *
# 1426| ValueCategory = prvalue
# 1427| getStmt(4): [ReturnStmt] return ...
# 1429| [CopyAssignmentOperator] POD_Base& POD_Base::operator=(POD_Base const&)
# 1429| <params>:
#-----| getParameter(0): [Parameter] (unnamed parameter 0)
#-----| Type = [LValueReferenceType] const POD_Base &
# 1429| [MoveAssignmentOperator] POD_Base& POD_Base::operator=(POD_Base&&)
# 1429| <params>:
#-----| getParameter(0): [Parameter] (unnamed parameter 0)
#-----| Type = [RValueReferenceType] POD_Base &&
# 1432| [ConstMemberFunction] float POD_Base::f() const
# 1432| <params>:
# 1435| [CopyAssignmentOperator] POD_Middle& POD_Middle::operator=(POD_Middle const&)
# 1435| <params>:
#-----| getParameter(0): [Parameter] (unnamed parameter 0)
#-----| Type = [LValueReferenceType] const POD_Middle &
# 1435| [MoveAssignmentOperator] POD_Middle& POD_Middle::operator=(POD_Middle&&)
# 1435| <params>:
#-----| getParameter(0): [Parameter] (unnamed parameter 0)
#-----| Type = [RValueReferenceType] POD_Middle &&
# 1435| [Constructor] void POD_Middle::POD_Middle()
# 1435| <params>:
# 1439| [CopyAssignmentOperator] POD_Derived& POD_Derived::operator=(POD_Derived const&)
# 1439| <params>:
#-----| getParameter(0): [Parameter] (unnamed parameter 0)
#-----| Type = [LValueReferenceType] const POD_Derived &
# 1439| [MoveAssignmentOperator] POD_Derived& POD_Derived::operator=(POD_Derived&&)
# 1439| <params>:
#-----| getParameter(0): [Parameter] (unnamed parameter 0)
#-----| Type = [RValueReferenceType] POD_Derived &&
# 1439| [Constructor] void POD_Derived::POD_Derived()
# 1439| <params>:
# 1443| [TopLevelFunction] void temporary_hierarchy()
# 1443| <params>:
# 1443| getEntryPoint(): [BlockStmt] { ... }
# 1444| getStmt(0): [DeclStmt] declaration
# 1444| getDeclarationEntry(0): [VariableDeclarationEntry] definition of b
# 1444| Type = [Struct] POD_Base
# 1444| getVariable().getInitializer(): [Initializer] initializer for b
# 1444| getExpr(): [FunctionCall] call to returnValue
# 1444| Type = [Struct] POD_Middle
# 1444| ValueCategory = prvalue
# 1444| getExpr().getFullyConverted(): [CStyleCast] (POD_Base)...
# 1444| Conversion = [BaseClassConversion] base class conversion
# 1444| Type = [Struct] POD_Base
# 1444| ValueCategory = prvalue
# 1445| getStmt(1): [ExprStmt] ExprStmt
# 1445| getExpr(): [AssignExpr] ... = ...
# 1445| Type = [Struct] POD_Base
# 1445| ValueCategory = lvalue
# 1445| getLValue(): [VariableAccess] b
# 1445| Type = [Struct] POD_Base
# 1445| ValueCategory = lvalue
# 1445| getRValue(): [FunctionCall] call to returnValue
# 1445| Type = [Struct] POD_Derived
# 1445| ValueCategory = prvalue
# 1445| getRValue().getFullyConverted(): [CStyleCast] (POD_Base)...
# 1445| Conversion = [BaseClassConversion] base class conversion
# 1445| Type = [Struct] POD_Base
# 1445| ValueCategory = prvalue(load)
# 1445| getExpr(): [CStyleCast] (POD_Middle)...
# 1445| Conversion = [BaseClassConversion] base class conversion
# 1445| Type = [Struct] POD_Middle
# 1445| ValueCategory = lvalue
# 1445| getExpr(): [TemporaryObjectExpr] temporary object
# 1445| Type = [Struct] POD_Derived
# 1445| ValueCategory = lvalue
# 1445| getExpr(): [ParenthesisExpr] (...)
# 1445| Type = [Struct] POD_Derived
# 1445| ValueCategory = prvalue
# 1446| getStmt(2): [DeclStmt] declaration
# 1446| getDeclarationEntry(0): [VariableDeclarationEntry] definition of x
# 1446| Type = [IntType] int
# 1446| getVariable().getInitializer(): [Initializer] initializer for x
# 1446| getExpr(): [ValueFieldAccess] x
# 1446| Type = [IntType] int
# 1446| ValueCategory = prvalue
# 1446| getQualifier(): [FunctionCall] call to returnValue
# 1446| Type = [Struct] POD_Derived
# 1446| ValueCategory = prvalue
# 1446| getQualifier().getFullyConverted(): [CStyleCast] (POD_Base)...
# 1446| Conversion = [BaseClassConversion] base class conversion
# 1446| Type = [Struct] POD_Base
# 1446| ValueCategory = prvalue
# 1446| getExpr(): [CStyleCast] (POD_Middle)...
# 1446| Conversion = [BaseClassConversion] base class conversion
# 1446| Type = [Struct] POD_Middle
# 1446| ValueCategory = prvalue
# 1447| getStmt(3): [DeclStmt] declaration
# 1447| getDeclarationEntry(0): [VariableDeclarationEntry] definition of f
# 1447| Type = [FloatType] float
# 1447| getVariable().getInitializer(): [Initializer] initializer for f
# 1447| getExpr(): [FunctionCall] call to f
# 1447| Type = [FloatType] float
# 1447| ValueCategory = prvalue
# 1447| getQualifier(): [FunctionCall] call to returnValue
# 1447| Type = [Struct] POD_Derived
# 1447| ValueCategory = prvalue
# 1447| getQualifier().getFullyConverted(): [CStyleCast] (const POD_Base)...
# 1447| Conversion = [BaseClassConversion] base class conversion
# 1447| Type = [SpecifiedType] const POD_Base
# 1447| ValueCategory = prvalue
# 1447| getExpr(): [CStyleCast] (POD_Middle)...
# 1447| Conversion = [BaseClassConversion] base class conversion
# 1447| Type = [Struct] POD_Middle
# 1447| ValueCategory = prvalue
# 1447| getExpr(): [ParenthesisExpr] (...)
# 1447| Type = [Struct] POD_Derived
# 1447| ValueCategory = prvalue
# 1448| getStmt(4): [ReturnStmt] return ...
perf-regression.cpp:
# 4| [CopyAssignmentOperator] Big& Big::operator=(Big const&)
# 4| <params>:

View File

@@ -1,8 +1,4 @@
missingOperand
| ir.cpp:809:7:809:13 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() |
| ir.cpp:810:7:810:26 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() |
| ir.cpp:823:7:823:13 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() |
| ir.cpp:824:7:824:26 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() |
unexpectedOperand
duplicateOperand
missingPhiOperand
@@ -25,6 +21,8 @@ notMarkedAsConflated
wronglyMarkedAsConflated
invalidOverlap
nonUniqueEnclosingIRFunction
fieldAddressOnNonPointer
thisArgumentIsNonPointer
missingCanonicalLanguageType
multipleCanonicalLanguageTypes
missingIRType

View File

@@ -1,8 +1,4 @@
missingOperand
| ir.cpp:809:7:809:13 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() |
| ir.cpp:810:7:810:26 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() |
| ir.cpp:823:7:823:13 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() |
| ir.cpp:824:7:824:26 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() |
unexpectedOperand
duplicateOperand
missingPhiOperand
@@ -25,6 +21,8 @@ notMarkedAsConflated
wronglyMarkedAsConflated
invalidOverlap
nonUniqueEnclosingIRFunction
fieldAddressOnNonPointer
thisArgumentIsNonPointer
missingCanonicalLanguageType
multipleCanonicalLanguageTypes
missingIRType

View File

@@ -1322,4 +1322,129 @@ void f(int* p)
new (p) int;
}
template<typename T>
T defaultConstruct() {
return T();
}
class constructor_only {
public:
int x;
public:
constructor_only(int x);
};
class copy_constructor {
public:
int y;
public:
copy_constructor();
copy_constructor(const copy_constructor&);
void method();
};
class destructor_only {
public:
~destructor_only();
void method();
};
template<typename T>
void acceptRef(const T& v);
template<typename T>
void acceptValue(T v);
template<typename T>
T returnValue();
void temporary_string() {
String s = returnValue<String>(); // No temporary
const String& rs = returnValue<String>(); // Binding a reference variable to a temporary
acceptRef(s); // No temporary
acceptRef<String>("foo"); // Binding a const reference to a temporary
acceptValue(s);
acceptValue<String>("foo");
String().c_str();
returnValue<String>().c_str(); // Member access on a temporary
defaultConstruct<String>();
}
void temporary_destructor_only() {
destructor_only d = returnValue<destructor_only>();
const destructor_only& rd = returnValue<destructor_only>();
destructor_only d2;
acceptRef(d);
acceptValue(d);
destructor_only().method();
returnValue<destructor_only>().method();
defaultConstruct<destructor_only>();
}
void temporary_copy_constructor() {
copy_constructor d = returnValue<copy_constructor>();
const copy_constructor& rd = returnValue<copy_constructor>();
copy_constructor d2;
acceptRef(d);
acceptValue(d);
copy_constructor().method();
returnValue<copy_constructor>().method();
defaultConstruct<copy_constructor>();
int y = returnValue<copy_constructor>().y;
}
void temporary_point() {
Point p = returnValue<Point>(); // No temporary
const Point& rp = returnValue<Point>(); // Binding a reference variable to a temporary
acceptRef(p); // No temporary
acceptValue(p);
Point().x;
int y = returnValue<Point>().y;
defaultConstruct<Point>();
}
struct UnusualFields {
int& r;
float a[10];
};
void temporary_unusual_fields() {
const int& rx = returnValue<UnusualFields>().r;
int x = returnValue<UnusualFields>().r;
const float& rf = returnValue<UnusualFields>().a[3];
float f = returnValue<UnusualFields>().a[5];
}
struct POD_Base {
int x;
float f() const;
};
struct POD_Middle : POD_Base {
int y;
};
struct POD_Derived : POD_Middle {
int z;
};
void temporary_hierarchy() {
POD_Base b = returnValue<POD_Middle>();
b = (returnValue<POD_Derived>()); // Multiple conversions plus parens
int x = returnValue<POD_Derived>().x;
float f = (returnValue<POD_Derived>()).f();
}
// semmle-extractor-options: -std=c++17 --clang

View File

@@ -1,8 +1,4 @@
missingOperand
| ir.cpp:809:7:809:13 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() |
| ir.cpp:810:7:810:26 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() |
| ir.cpp:823:7:823:13 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() |
| ir.cpp:824:7:824:26 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() |
unexpectedOperand
duplicateOperand
missingPhiOperand
@@ -25,6 +21,8 @@ notMarkedAsConflated
wronglyMarkedAsConflated
invalidOverlap
nonUniqueEnclosingIRFunction
fieldAddressOnNonPointer
thisArgumentIsNonPointer
missingCanonicalLanguageType
multipleCanonicalLanguageTypes
missingIRType

View File

@@ -3824,23 +3824,26 @@ ir.cpp:
# 715| long Outer<long>::Func<void*, char>(void*, char)
# 715| Block 0
# 715| v715_1(void) = EnterFunction :
# 715| mu715_2(unknown) = AliasedDefinition :
# 715| mu715_3(unknown) = InitializeNonLocal :
# 715| r715_4(glval<void *>) = VariableAddress[x] :
# 715| mu715_5(void *) = InitializeParameter[x] : &:r715_4
# 715| r715_6(void *) = Load[x] : &:r715_4, ~m?
# 715| mu715_7(unknown) = InitializeIndirection[x] : &:r715_6
# 715| r715_8(glval<char>) = VariableAddress[y] :
# 715| mu715_9(char) = InitializeParameter[y] : &:r715_8
# 716| r716_1(glval<long>) = VariableAddress[#return] :
# 716| r716_2(long) = Constant[0] :
# 716| mu716_3(long) = Store[#return] : &:r716_1, r716_2
# 715| v715_10(void) = ReturnIndirection[x] : &:r715_6, ~m?
# 715| r715_11(glval<long>) = VariableAddress[#return] :
# 715| v715_12(void) = ReturnValue : &:r715_11, ~m?
# 715| v715_13(void) = AliasedUse : ~m?
# 715| v715_14(void) = ExitFunction :
# 715| v715_1(void) = EnterFunction :
# 715| mu715_2(unknown) = AliasedDefinition :
# 715| mu715_3(unknown) = InitializeNonLocal :
# 715| r715_4(glval<void *>) = VariableAddress[x] :
# 715| mu715_5(void *) = InitializeParameter[x] : &:r715_4
# 715| r715_6(void *) = Load[x] : &:r715_4, ~m?
# 715| mu715_7(unknown) = InitializeIndirection[x] : &:r715_6
# 715| r715_8(glval<char>) = VariableAddress[y] :
# 715| mu715_9(char) = InitializeParameter[y] : &:r715_8
# 716| r716_1(glval<long>) = VariableAddress[#return] :
# 716| r716_2(glval<long>) = VariableAddress[#temp716:12] :
# 716| r716_3(long) = Constant[0] :
# 716| mu716_4(long) = Store[#temp716:12] : &:r716_2, r716_3
# 716| r716_5(long) = Load[#temp716:12] : &:r716_2, ~m?
# 716| mu716_6(long) = Store[#return] : &:r716_1, r716_5
# 715| v715_10(void) = ReturnIndirection[x] : &:r715_6, ~m?
# 715| r715_11(glval<long>) = VariableAddress[#return] :
# 715| v715_12(void) = ReturnValue : &:r715_11, ~m?
# 715| v715_13(void) = AliasedUse : ~m?
# 715| v715_14(void) = ExitFunction :
# 720| double CallNestedTemplateFunc()
# 720| Block 0
@@ -4522,44 +4525,48 @@ ir.cpp:
# 808| r808_12(glval<Base>) = CopyValue : r808_6
# 809| r809_1(glval<Base>) = VariableAddress[b] :
# 809| r809_2(glval<unknown>) = FunctionAddress[operator=] :
# 809| r809_3(glval<unknown>) = FunctionAddress[Base] :
# 809| r809_4(glval<Middle>) = VariableAddress[m] :
# 809| r809_5(glval<Base>) = ConvertToNonVirtualBase[Middle : Base] : r809_4
# 809| r809_6(Base &) = CopyValue : r809_5
# 809| v809_7(void) = Call[Base] : func:r809_3, 0:r809_6
# 809| mu809_8(unknown) = ^CallSideEffect : ~m?
# 809| mu809_9(Base) = ^IndirectMayWriteSideEffect[-1] :
# 809| v809_10(void) = ^BufferReadSideEffect[0] : &:r809_6, ~m?
# 809| mu809_11(unknown) = ^BufferMayWriteSideEffect[0] : &:r809_6
# 809| r809_12(glval<Base>) = Convert : v809_7
# 809| r809_13(Base &) = CopyValue : r809_12
# 809| r809_14(Base &) = Call[operator=] : func:r809_2, this:r809_1, 0:r809_13
# 809| mu809_15(unknown) = ^CallSideEffect : ~m?
# 809| v809_16(void) = ^BufferReadSideEffect[-1] : &:r809_1, ~m?
# 809| v809_17(void) = ^BufferReadSideEffect[0] : &:r809_13, ~m?
# 809| mu809_18(Base) = ^IndirectMayWriteSideEffect[-1] : &:r809_1
# 809| mu809_19(unknown) = ^BufferMayWriteSideEffect[0] : &:r809_13
# 809| r809_20(glval<Base>) = CopyValue : r809_14
# 809| r809_3(glval<Base>) = VariableAddress[#temp809:7] :
# 809| mu809_4(Base) = Uninitialized[#temp809:7] : &:r809_3
# 809| r809_5(glval<unknown>) = FunctionAddress[Base] :
# 809| r809_6(glval<Middle>) = VariableAddress[m] :
# 809| r809_7(glval<Base>) = ConvertToNonVirtualBase[Middle : Base] : r809_6
# 809| r809_8(Base &) = CopyValue : r809_7
# 809| v809_9(void) = Call[Base] : func:r809_5, this:r809_3, 0:r809_8
# 809| mu809_10(unknown) = ^CallSideEffect : ~m?
# 809| mu809_11(Base) = ^IndirectMayWriteSideEffect[-1] : &:r809_3
# 809| v809_12(void) = ^BufferReadSideEffect[0] : &:r809_8, ~m?
# 809| mu809_13(unknown) = ^BufferMayWriteSideEffect[0] : &:r809_8
# 809| r809_14(glval<Base>) = Convert : r809_3
# 809| r809_15(Base &) = CopyValue : r809_14
# 809| r809_16(Base &) = Call[operator=] : func:r809_2, this:r809_1, 0:r809_15
# 809| mu809_17(unknown) = ^CallSideEffect : ~m?
# 809| v809_18(void) = ^BufferReadSideEffect[-1] : &:r809_1, ~m?
# 809| v809_19(void) = ^BufferReadSideEffect[0] : &:r809_15, ~m?
# 809| mu809_20(Base) = ^IndirectMayWriteSideEffect[-1] : &:r809_1
# 809| mu809_21(unknown) = ^BufferMayWriteSideEffect[0] : &:r809_15
# 809| r809_22(glval<Base>) = CopyValue : r809_16
# 810| r810_1(glval<Base>) = VariableAddress[b] :
# 810| r810_2(glval<unknown>) = FunctionAddress[operator=] :
# 810| r810_3(glval<unknown>) = FunctionAddress[Base] :
# 810| r810_4(glval<Middle>) = VariableAddress[m] :
# 810| r810_5(glval<Base>) = ConvertToNonVirtualBase[Middle : Base] : r810_4
# 810| r810_6(Base &) = CopyValue : r810_5
# 810| v810_7(void) = Call[Base] : func:r810_3, 0:r810_6
# 810| mu810_8(unknown) = ^CallSideEffect : ~m?
# 810| mu810_9(Base) = ^IndirectMayWriteSideEffect[-1] :
# 810| v810_10(void) = ^BufferReadSideEffect[0] : &:r810_6, ~m?
# 810| mu810_11(unknown) = ^BufferMayWriteSideEffect[0] : &:r810_6
# 810| r810_12(glval<Base>) = Convert : v810_7
# 810| r810_13(Base &) = CopyValue : r810_12
# 810| r810_14(Base &) = Call[operator=] : func:r810_2, this:r810_1, 0:r810_13
# 810| mu810_15(unknown) = ^CallSideEffect : ~m?
# 810| v810_16(void) = ^BufferReadSideEffect[-1] : &:r810_1, ~m?
# 810| v810_17(void) = ^BufferReadSideEffect[0] : &:r810_13, ~m?
# 810| mu810_18(Base) = ^IndirectMayWriteSideEffect[-1] : &:r810_1
# 810| mu810_19(unknown) = ^BufferMayWriteSideEffect[0] : &:r810_13
# 810| r810_20(glval<Base>) = CopyValue : r810_14
# 810| r810_3(glval<Base>) = VariableAddress[#temp810:7] :
# 810| mu810_4(Base) = Uninitialized[#temp810:7] : &:r810_3
# 810| r810_5(glval<unknown>) = FunctionAddress[Base] :
# 810| r810_6(glval<Middle>) = VariableAddress[m] :
# 810| r810_7(glval<Base>) = ConvertToNonVirtualBase[Middle : Base] : r810_6
# 810| r810_8(Base &) = CopyValue : r810_7
# 810| v810_9(void) = Call[Base] : func:r810_5, this:r810_3, 0:r810_8
# 810| mu810_10(unknown) = ^CallSideEffect : ~m?
# 810| mu810_11(Base) = ^IndirectMayWriteSideEffect[-1] : &:r810_3
# 810| v810_12(void) = ^BufferReadSideEffect[0] : &:r810_8, ~m?
# 810| mu810_13(unknown) = ^BufferMayWriteSideEffect[0] : &:r810_8
# 810| r810_14(glval<Base>) = Convert : r810_3
# 810| r810_15(Base &) = CopyValue : r810_14
# 810| r810_16(Base &) = Call[operator=] : func:r810_2, this:r810_1, 0:r810_15
# 810| mu810_17(unknown) = ^CallSideEffect : ~m?
# 810| v810_18(void) = ^BufferReadSideEffect[-1] : &:r810_1, ~m?
# 810| v810_19(void) = ^BufferReadSideEffect[0] : &:r810_15, ~m?
# 810| mu810_20(Base) = ^IndirectMayWriteSideEffect[-1] : &:r810_1
# 810| mu810_21(unknown) = ^BufferMayWriteSideEffect[0] : &:r810_15
# 810| r810_22(glval<Base>) = CopyValue : r810_16
# 811| r811_1(glval<Middle *>) = VariableAddress[pm] :
# 811| r811_2(Middle *) = Load[pm] : &:r811_1, ~m?
# 811| r811_3(Base *) = ConvertToNonVirtualBase[Middle : Base] : r811_2
@@ -4636,46 +4643,50 @@ ir.cpp:
# 822| r822_13(glval<Base>) = CopyValue : r822_7
# 823| r823_1(glval<Base>) = VariableAddress[b] :
# 823| r823_2(glval<unknown>) = FunctionAddress[operator=] :
# 823| r823_3(glval<unknown>) = FunctionAddress[Base] :
# 823| r823_4(glval<Derived>) = VariableAddress[d] :
# 823| r823_5(glval<Middle>) = ConvertToNonVirtualBase[Derived : Middle] : r823_4
# 823| r823_6(glval<Base>) = ConvertToNonVirtualBase[Middle : Base] : r823_5
# 823| r823_7(Base &) = CopyValue : r823_6
# 823| v823_8(void) = Call[Base] : func:r823_3, 0:r823_7
# 823| mu823_9(unknown) = ^CallSideEffect : ~m?
# 823| mu823_10(Base) = ^IndirectMayWriteSideEffect[-1] :
# 823| v823_11(void) = ^BufferReadSideEffect[0] : &:r823_7, ~m?
# 823| mu823_12(unknown) = ^BufferMayWriteSideEffect[0] : &:r823_7
# 823| r823_13(glval<Base>) = Convert : v823_8
# 823| r823_14(Base &) = CopyValue : r823_13
# 823| r823_15(Base &) = Call[operator=] : func:r823_2, this:r823_1, 0:r823_14
# 823| mu823_16(unknown) = ^CallSideEffect : ~m?
# 823| v823_17(void) = ^BufferReadSideEffect[-1] : &:r823_1, ~m?
# 823| v823_18(void) = ^BufferReadSideEffect[0] : &:r823_14, ~m?
# 823| mu823_19(Base) = ^IndirectMayWriteSideEffect[-1] : &:r823_1
# 823| mu823_20(unknown) = ^BufferMayWriteSideEffect[0] : &:r823_14
# 823| r823_21(glval<Base>) = CopyValue : r823_15
# 823| r823_3(glval<Base>) = VariableAddress[#temp823:7] :
# 823| mu823_4(Base) = Uninitialized[#temp823:7] : &:r823_3
# 823| r823_5(glval<unknown>) = FunctionAddress[Base] :
# 823| r823_6(glval<Derived>) = VariableAddress[d] :
# 823| r823_7(glval<Middle>) = ConvertToNonVirtualBase[Derived : Middle] : r823_6
# 823| r823_8(glval<Base>) = ConvertToNonVirtualBase[Middle : Base] : r823_7
# 823| r823_9(Base &) = CopyValue : r823_8
# 823| v823_10(void) = Call[Base] : func:r823_5, this:r823_3, 0:r823_9
# 823| mu823_11(unknown) = ^CallSideEffect : ~m?
# 823| mu823_12(Base) = ^IndirectMayWriteSideEffect[-1] : &:r823_3
# 823| v823_13(void) = ^BufferReadSideEffect[0] : &:r823_9, ~m?
# 823| mu823_14(unknown) = ^BufferMayWriteSideEffect[0] : &:r823_9
# 823| r823_15(glval<Base>) = Convert : r823_3
# 823| r823_16(Base &) = CopyValue : r823_15
# 823| r823_17(Base &) = Call[operator=] : func:r823_2, this:r823_1, 0:r823_16
# 823| mu823_18(unknown) = ^CallSideEffect : ~m?
# 823| v823_19(void) = ^BufferReadSideEffect[-1] : &:r823_1, ~m?
# 823| v823_20(void) = ^BufferReadSideEffect[0] : &:r823_16, ~m?
# 823| mu823_21(Base) = ^IndirectMayWriteSideEffect[-1] : &:r823_1
# 823| mu823_22(unknown) = ^BufferMayWriteSideEffect[0] : &:r823_16
# 823| r823_23(glval<Base>) = CopyValue : r823_17
# 824| r824_1(glval<Base>) = VariableAddress[b] :
# 824| r824_2(glval<unknown>) = FunctionAddress[operator=] :
# 824| r824_3(glval<unknown>) = FunctionAddress[Base] :
# 824| r824_4(glval<Derived>) = VariableAddress[d] :
# 824| r824_5(glval<Middle>) = ConvertToNonVirtualBase[Derived : Middle] : r824_4
# 824| r824_6(glval<Base>) = ConvertToNonVirtualBase[Middle : Base] : r824_5
# 824| r824_7(Base &) = CopyValue : r824_6
# 824| v824_8(void) = Call[Base] : func:r824_3, 0:r824_7
# 824| mu824_9(unknown) = ^CallSideEffect : ~m?
# 824| mu824_10(Base) = ^IndirectMayWriteSideEffect[-1] :
# 824| v824_11(void) = ^BufferReadSideEffect[0] : &:r824_7, ~m?
# 824| mu824_12(unknown) = ^BufferMayWriteSideEffect[0] : &:r824_7
# 824| r824_13(glval<Base>) = Convert : v824_8
# 824| r824_14(Base &) = CopyValue : r824_13
# 824| r824_15(Base &) = Call[operator=] : func:r824_2, this:r824_1, 0:r824_14
# 824| mu824_16(unknown) = ^CallSideEffect : ~m?
# 824| v824_17(void) = ^BufferReadSideEffect[-1] : &:r824_1, ~m?
# 824| v824_18(void) = ^BufferReadSideEffect[0] : &:r824_14, ~m?
# 824| mu824_19(Base) = ^IndirectMayWriteSideEffect[-1] : &:r824_1
# 824| mu824_20(unknown) = ^BufferMayWriteSideEffect[0] : &:r824_14
# 824| r824_21(glval<Base>) = CopyValue : r824_15
# 824| r824_3(glval<Base>) = VariableAddress[#temp824:7] :
# 824| mu824_4(Base) = Uninitialized[#temp824:7] : &:r824_3
# 824| r824_5(glval<unknown>) = FunctionAddress[Base] :
# 824| r824_6(glval<Derived>) = VariableAddress[d] :
# 824| r824_7(glval<Middle>) = ConvertToNonVirtualBase[Derived : Middle] : r824_6
# 824| r824_8(glval<Base>) = ConvertToNonVirtualBase[Middle : Base] : r824_7
# 824| r824_9(Base &) = CopyValue : r824_8
# 824| v824_10(void) = Call[Base] : func:r824_5, this:r824_3, 0:r824_9
# 824| mu824_11(unknown) = ^CallSideEffect : ~m?
# 824| mu824_12(Base) = ^IndirectMayWriteSideEffect[-1] : &:r824_3
# 824| v824_13(void) = ^BufferReadSideEffect[0] : &:r824_9, ~m?
# 824| mu824_14(unknown) = ^BufferMayWriteSideEffect[0] : &:r824_9
# 824| r824_15(glval<Base>) = Convert : r824_3
# 824| r824_16(Base &) = CopyValue : r824_15
# 824| r824_17(Base &) = Call[operator=] : func:r824_2, this:r824_1, 0:r824_16
# 824| mu824_18(unknown) = ^CallSideEffect : ~m?
# 824| v824_19(void) = ^BufferReadSideEffect[-1] : &:r824_1, ~m?
# 824| v824_20(void) = ^BufferReadSideEffect[0] : &:r824_16, ~m?
# 824| mu824_21(Base) = ^IndirectMayWriteSideEffect[-1] : &:r824_1
# 824| mu824_22(unknown) = ^BufferMayWriteSideEffect[0] : &:r824_16
# 824| r824_23(glval<Base>) = CopyValue : r824_17
# 825| r825_1(glval<Derived *>) = VariableAddress[pd] :
# 825| r825_2(Derived *) = Load[pd] : &:r825_1, ~m?
# 825| r825_3(Middle *) = ConvertToNonVirtualBase[Derived : Middle] : r825_2
@@ -4826,16 +4837,16 @@ ir.cpp:
# 849| mu849_3(unknown) = InitializeNonLocal :
# 850| r850_1(glval<PolymorphicBase>) = VariableAddress[b] :
# 850| mu850_2(PolymorphicBase) = Uninitialized[b] : &:r850_1
#-----| r0_1(glval<unknown>) = FunctionAddress[PolymorphicBase] :
#-----| v0_2(void) = Call[PolymorphicBase] : func:r0_1, this:r850_1
#-----| mu0_3(unknown) = ^CallSideEffect : ~m?
#-----| mu0_4(PolymorphicBase) = ^IndirectMayWriteSideEffect[-1] : &:r850_1
# 850| r850_3(glval<unknown>) = FunctionAddress[PolymorphicBase] :
# 850| v850_4(void) = Call[PolymorphicBase] : func:r850_3, this:r850_1
# 850| mu850_5(unknown) = ^CallSideEffect : ~m?
# 850| mu850_6(PolymorphicBase) = ^IndirectMayWriteSideEffect[-1] : &:r850_1
# 851| r851_1(glval<PolymorphicDerived>) = VariableAddress[d] :
# 851| mu851_2(PolymorphicDerived) = Uninitialized[d] : &:r851_1
#-----| r0_5(glval<unknown>) = FunctionAddress[PolymorphicDerived] :
#-----| v0_6(void) = Call[PolymorphicDerived] : func:r0_5, this:r851_1
#-----| mu0_7(unknown) = ^CallSideEffect : ~m?
#-----| mu0_8(PolymorphicDerived) = ^IndirectMayWriteSideEffect[-1] : &:r851_1
# 851| r851_3(glval<unknown>) = FunctionAddress[PolymorphicDerived] :
# 851| v851_4(void) = Call[PolymorphicDerived] : func:r851_3, this:r851_1
# 851| mu851_5(unknown) = ^CallSideEffect : ~m?
# 851| mu851_6(PolymorphicDerived) = ^IndirectMayWriteSideEffect[-1] : &:r851_1
# 853| r853_1(glval<PolymorphicBase *>) = VariableAddress[pb] :
# 853| r853_2(glval<PolymorphicBase>) = VariableAddress[b] :
# 853| r853_3(PolymorphicBase *) = CopyValue : r853_2
@@ -6616,7 +6627,7 @@ ir.cpp:
# 1179| r1179_3(glval<unknown>) = FunctionAddress[String] :
# 1179| r1179_4(glval<char[4]>) = StringConstant["foo"] :
# 1179| r1179_5(char *) = Convert : r1179_4
# 1179| r1179_6(String) = Call[String] : func:r1179_3, this:r1179_1, 0:r1179_5
# 1179| v1179_6(void) = Call[String] : func:r1179_3, this:r1179_1, 0:r1179_5
# 1179| mu1179_7(unknown) = ^CallSideEffect : ~m?
# 1179| mu1179_8(String) = ^IndirectMayWriteSideEffect[-1] : &:r1179_1
# 1179| v1179_9(void) = ^BufferReadSideEffect[0] : &:r1179_5, ~m?
@@ -7433,6 +7444,486 @@ ir.cpp:
# 1320| v1320_10(void) = AliasedUse : ~m?
# 1320| v1320_11(void) = ExitFunction :
# 1326| Point defaultConstruct<Point>()
# 1326| Block 0
# 1326| v1326_1(void) = EnterFunction :
# 1326| mu1326_2(unknown) = AliasedDefinition :
# 1326| mu1326_3(unknown) = InitializeNonLocal :
# 1327| r1327_1(glval<Point>) = VariableAddress[#return] :
# 1327| r1327_2(Point) = Constant[0] :
# 1327| mu1327_3(Point) = Store[#return] : &:r1327_1, r1327_2
# 1326| r1326_4(glval<Point>) = VariableAddress[#return] :
# 1326| v1326_5(void) = ReturnValue : &:r1326_4, ~m?
# 1326| v1326_6(void) = AliasedUse : ~m?
# 1326| v1326_7(void) = ExitFunction :
# 1326| String defaultConstruct<String>()
# 1326| Block 0
# 1326| v1326_1(void) = EnterFunction :
# 1326| mu1326_2(unknown) = AliasedDefinition :
# 1326| mu1326_3(unknown) = InitializeNonLocal :
# 1327| r1327_1(glval<String>) = VariableAddress[#return] :
# 1327| mu1327_2(String) = Uninitialized[#return] : &:r1327_1
# 1327| r1327_3(glval<unknown>) = FunctionAddress[String] :
# 1327| v1327_4(void) = Call[String] : func:r1327_3, this:r1327_1
# 1327| mu1327_5(unknown) = ^CallSideEffect : ~m?
# 1327| mu1327_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r1327_1
# 1326| r1326_4(glval<String>) = VariableAddress[#return] :
# 1326| v1326_5(void) = ReturnValue : &:r1326_4, ~m?
# 1326| v1326_6(void) = AliasedUse : ~m?
# 1326| v1326_7(void) = ExitFunction :
# 1326| copy_constructor defaultConstruct<copy_constructor>()
# 1326| Block 0
# 1326| v1326_1(void) = EnterFunction :
# 1326| mu1326_2(unknown) = AliasedDefinition :
# 1326| mu1326_3(unknown) = InitializeNonLocal :
# 1327| r1327_1(glval<copy_constructor>) = VariableAddress[#return] :
# 1327| mu1327_2(copy_constructor) = Uninitialized[#return] : &:r1327_1
# 1327| r1327_3(glval<unknown>) = FunctionAddress[copy_constructor] :
# 1327| v1327_4(void) = Call[copy_constructor] : func:r1327_3, this:r1327_1
# 1327| mu1327_5(unknown) = ^CallSideEffect : ~m?
# 1327| mu1327_6(copy_constructor) = ^IndirectMayWriteSideEffect[-1] : &:r1327_1
# 1326| r1326_4(glval<copy_constructor>) = VariableAddress[#return] :
# 1326| v1326_5(void) = ReturnValue : &:r1326_4, ~m?
# 1326| v1326_6(void) = AliasedUse : ~m?
# 1326| v1326_7(void) = ExitFunction :
# 1326| destructor_only defaultConstruct<destructor_only>()
# 1326| Block 0
# 1326| v1326_1(void) = EnterFunction :
# 1326| mu1326_2(unknown) = AliasedDefinition :
# 1326| mu1326_3(unknown) = InitializeNonLocal :
# 1327| r1327_1(glval<destructor_only>) = VariableAddress[#return] :
# 1327| r1327_2(destructor_only) = Constant[0] :
# 1327| mu1327_3(destructor_only) = Store[#return] : &:r1327_1, r1327_2
# 1326| r1326_4(glval<destructor_only>) = VariableAddress[#return] :
# 1326| v1326_5(void) = ReturnValue : &:r1326_4, ~m?
# 1326| v1326_6(void) = AliasedUse : ~m?
# 1326| v1326_7(void) = ExitFunction :
# 1365| void temporary_string()
# 1365| Block 0
# 1365| v1365_1(void) = EnterFunction :
# 1365| mu1365_2(unknown) = AliasedDefinition :
# 1365| mu1365_3(unknown) = InitializeNonLocal :
# 1366| r1366_1(glval<String>) = VariableAddress[s] :
# 1366| r1366_2(glval<unknown>) = FunctionAddress[returnValue] :
# 1366| r1366_3(String) = Call[returnValue] : func:r1366_2
# 1366| mu1366_4(unknown) = ^CallSideEffect : ~m?
# 1366| mu1366_5(String) = Store[s] : &:r1366_1, r1366_3
# 1367| r1367_1(glval<String &>) = VariableAddress[rs] :
# 1367| r1367_2(glval<String>) = VariableAddress[#temp1367:24] :
# 1367| r1367_3(glval<unknown>) = FunctionAddress[returnValue] :
# 1367| r1367_4(String) = Call[returnValue] : func:r1367_3
# 1367| mu1367_5(unknown) = ^CallSideEffect : ~m?
# 1367| mu1367_6(String) = Store[#temp1367:24] : &:r1367_2, r1367_4
# 1367| r1367_7(glval<String>) = Convert : r1367_2
# 1367| r1367_8(String &) = CopyValue : r1367_7
# 1367| mu1367_9(String &) = Store[rs] : &:r1367_1, r1367_8
# 1369| r1369_1(glval<unknown>) = FunctionAddress[acceptRef] :
# 1369| r1369_2(glval<String>) = VariableAddress[s] :
# 1369| r1369_3(glval<String>) = Convert : r1369_2
# 1369| r1369_4(String &) = CopyValue : r1369_3
# 1369| v1369_5(void) = Call[acceptRef] : func:r1369_1, 0:r1369_4
# 1369| mu1369_6(unknown) = ^CallSideEffect : ~m?
# 1369| v1369_7(void) = ^BufferReadSideEffect[0] : &:r1369_4, ~m?
# 1369| mu1369_8(unknown) = ^BufferMayWriteSideEffect[0] : &:r1369_4
# 1370| r1370_1(glval<unknown>) = FunctionAddress[acceptRef] :
# 1370| r1370_2(glval<String>) = VariableAddress[#temp1370:23] :
# 1370| mu1370_3(String) = Uninitialized[#temp1370:23] : &:r1370_2
# 1370| r1370_4(glval<unknown>) = FunctionAddress[String] :
# 1370| r1370_5(glval<char[4]>) = StringConstant["foo"] :
# 1370| r1370_6(char *) = Convert : r1370_5
# 1370| v1370_7(void) = Call[String] : func:r1370_4, this:r1370_2, 0:r1370_6
# 1370| mu1370_8(unknown) = ^CallSideEffect : ~m?
# 1370| mu1370_9(String) = ^IndirectMayWriteSideEffect[-1] : &:r1370_2
# 1370| v1370_10(void) = ^BufferReadSideEffect[0] : &:r1370_6, ~m?
# 1370| mu1370_11(unknown) = ^BufferMayWriteSideEffect[0] : &:r1370_6
# 1370| r1370_12(String &) = CopyValue : r1370_2
# 1370| v1370_13(void) = Call[acceptRef] : func:r1370_1, 0:r1370_12
# 1370| mu1370_14(unknown) = ^CallSideEffect : ~m?
# 1370| v1370_15(void) = ^BufferReadSideEffect[0] : &:r1370_12, ~m?
# 1370| mu1370_16(unknown) = ^BufferMayWriteSideEffect[0] : &:r1370_12
# 1371| r1371_1(glval<unknown>) = FunctionAddress[acceptValue] :
# 1371| r1371_2(glval<String>) = VariableAddress[#temp1371:17] :
# 1371| mu1371_3(String) = Uninitialized[#temp1371:17] : &:r1371_2
# 1371| r1371_4(glval<unknown>) = FunctionAddress[String] :
# 1371| r1371_5(glval<String>) = VariableAddress[s] :
# 1371| r1371_6(glval<String>) = Convert : r1371_5
# 1371| r1371_7(String &) = CopyValue : r1371_6
# 1371| v1371_8(void) = Call[String] : func:r1371_4, this:r1371_2, 0:r1371_7
# 1371| mu1371_9(unknown) = ^CallSideEffect : ~m?
# 1371| mu1371_10(String) = ^IndirectMayWriteSideEffect[-1] : &:r1371_2
# 1371| v1371_11(void) = ^BufferReadSideEffect[0] : &:r1371_7, ~m?
# 1371| mu1371_12(unknown) = ^BufferMayWriteSideEffect[0] : &:r1371_7
# 1371| r1371_13(String) = Load[#temp1371:17] : &:r1371_2, ~m?
# 1371| v1371_14(void) = Call[acceptValue] : func:r1371_1, 0:r1371_13
# 1371| mu1371_15(unknown) = ^CallSideEffect : ~m?
# 1372| r1372_1(glval<unknown>) = FunctionAddress[acceptValue] :
# 1372| r1372_2(glval<String>) = VariableAddress[#temp1372:25] :
# 1372| mu1372_3(String) = Uninitialized[#temp1372:25] : &:r1372_2
# 1372| r1372_4(glval<unknown>) = FunctionAddress[String] :
# 1372| r1372_5(glval<char[4]>) = StringConstant["foo"] :
# 1372| r1372_6(char *) = Convert : r1372_5
# 1372| v1372_7(void) = Call[String] : func:r1372_4, this:r1372_2, 0:r1372_6
# 1372| mu1372_8(unknown) = ^CallSideEffect : ~m?
# 1372| mu1372_9(String) = ^IndirectMayWriteSideEffect[-1] : &:r1372_2
# 1372| v1372_10(void) = ^BufferReadSideEffect[0] : &:r1372_6, ~m?
# 1372| mu1372_11(unknown) = ^BufferMayWriteSideEffect[0] : &:r1372_6
# 1372| r1372_12(String) = Load[#temp1372:25] : &:r1372_2, ~m?
# 1372| v1372_13(void) = Call[acceptValue] : func:r1372_1, 0:r1372_12
# 1372| mu1372_14(unknown) = ^CallSideEffect : ~m?
# 1373| r1373_1(glval<String>) = VariableAddress[#temp1373:5] :
# 1373| mu1373_2(String) = Uninitialized[#temp1373:5] : &:r1373_1
# 1373| r1373_3(glval<unknown>) = FunctionAddress[String] :
# 1373| v1373_4(void) = Call[String] : func:r1373_3, this:r1373_1
# 1373| mu1373_5(unknown) = ^CallSideEffect : ~m?
# 1373| mu1373_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r1373_1
# 1373| r1373_7(glval<String>) = Convert : r1373_1
# 1373| r1373_8(glval<unknown>) = FunctionAddress[c_str] :
# 1373| r1373_9(char *) = Call[c_str] : func:r1373_8, this:r1373_7
# 1373| mu1373_10(unknown) = ^CallSideEffect : ~m?
# 1373| v1373_11(void) = ^BufferReadSideEffect[-1] : &:r1373_7, ~m?
# 1373| mu1373_12(String) = ^IndirectMayWriteSideEffect[-1] : &:r1373_7
# 1374| r1374_1(glval<String>) = VariableAddress[#temp1374:5] :
# 1374| r1374_2(glval<unknown>) = FunctionAddress[returnValue] :
# 1374| r1374_3(String) = Call[returnValue] : func:r1374_2
# 1374| mu1374_4(unknown) = ^CallSideEffect : ~m?
# 1374| mu1374_5(String) = Store[#temp1374:5] : &:r1374_1, r1374_3
# 1374| r1374_6(glval<String>) = Convert : r1374_1
# 1374| r1374_7(glval<unknown>) = FunctionAddress[c_str] :
# 1374| r1374_8(char *) = Call[c_str] : func:r1374_7, this:r1374_6
# 1374| mu1374_9(unknown) = ^CallSideEffect : ~m?
# 1374| v1374_10(void) = ^BufferReadSideEffect[-1] : &:r1374_6, ~m?
# 1374| mu1374_11(String) = ^IndirectMayWriteSideEffect[-1] : &:r1374_6
# 1376| r1376_1(glval<String>) = VariableAddress[#temp1376:5] :
# 1376| r1376_2(glval<unknown>) = FunctionAddress[defaultConstruct] :
# 1376| r1376_3(String) = Call[defaultConstruct] : func:r1376_2
# 1376| mu1376_4(unknown) = ^CallSideEffect : ~m?
# 1376| mu1376_5(String) = Store[#temp1376:5] : &:r1376_1, r1376_3
# 1376| r1376_6(String) = Load[#temp1376:5] : &:r1376_1, ~m?
# 1377| v1377_1(void) = NoOp :
# 1365| v1365_4(void) = ReturnVoid :
# 1365| v1365_5(void) = AliasedUse : ~m?
# 1365| v1365_6(void) = ExitFunction :
# 1379| void temporary_destructor_only()
# 1379| Block 0
# 1379| v1379_1(void) = EnterFunction :
# 1379| mu1379_2(unknown) = AliasedDefinition :
# 1379| mu1379_3(unknown) = InitializeNonLocal :
# 1380| r1380_1(glval<destructor_only>) = VariableAddress[d] :
# 1380| r1380_2(glval<unknown>) = FunctionAddress[returnValue] :
# 1380| r1380_3(destructor_only) = Call[returnValue] : func:r1380_2
# 1380| mu1380_4(unknown) = ^CallSideEffect : ~m?
# 1380| mu1380_5(destructor_only) = Store[d] : &:r1380_1, r1380_3
# 1381| r1381_1(glval<destructor_only &>) = VariableAddress[rd] :
# 1381| r1381_2(glval<destructor_only>) = VariableAddress[#temp1381:33] :
# 1381| r1381_3(glval<unknown>) = FunctionAddress[returnValue] :
# 1381| r1381_4(destructor_only) = Call[returnValue] : func:r1381_3
# 1381| mu1381_5(unknown) = ^CallSideEffect : ~m?
# 1381| mu1381_6(destructor_only) = Store[#temp1381:33] : &:r1381_2, r1381_4
# 1381| r1381_7(glval<destructor_only>) = Convert : r1381_2
# 1381| r1381_8(destructor_only &) = CopyValue : r1381_7
# 1381| mu1381_9(destructor_only &) = Store[rd] : &:r1381_1, r1381_8
# 1382| r1382_1(glval<destructor_only>) = VariableAddress[d2] :
# 1382| mu1382_2(destructor_only) = Uninitialized[d2] : &:r1382_1
# 1383| r1383_1(glval<unknown>) = FunctionAddress[acceptRef] :
# 1383| r1383_2(glval<destructor_only>) = VariableAddress[d] :
# 1383| r1383_3(glval<destructor_only>) = Convert : r1383_2
# 1383| r1383_4(destructor_only &) = CopyValue : r1383_3
# 1383| v1383_5(void) = Call[acceptRef] : func:r1383_1, 0:r1383_4
# 1383| mu1383_6(unknown) = ^CallSideEffect : ~m?
# 1383| v1383_7(void) = ^BufferReadSideEffect[0] : &:r1383_4, ~m?
# 1383| mu1383_8(unknown) = ^BufferMayWriteSideEffect[0] : &:r1383_4
# 1384| r1384_1(glval<unknown>) = FunctionAddress[acceptValue] :
# 1384| r1384_2(glval<destructor_only>) = VariableAddress[#temp1384:17] :
# 1384| r1384_3(glval<destructor_only>) = VariableAddress[d] :
# 1384| r1384_4(destructor_only) = Load[d] : &:r1384_3, ~m?
# 1384| mu1384_5(destructor_only) = Store[#temp1384:17] : &:r1384_2, r1384_4
# 1384| r1384_6(destructor_only) = Load[#temp1384:17] : &:r1384_2, ~m?
# 1384| v1384_7(void) = Call[acceptValue] : func:r1384_1, 0:r1384_6
# 1384| mu1384_8(unknown) = ^CallSideEffect : ~m?
# 1385| r1385_1(glval<destructor_only>) = VariableAddress[#temp1385:5] :
# 1385| r1385_2(destructor_only) = Constant[0] :
# 1385| mu1385_3(destructor_only) = Store[#temp1385:5] : &:r1385_1, r1385_2
# 1385| r1385_4(glval<unknown>) = FunctionAddress[method] :
# 1385| v1385_5(void) = Call[method] : func:r1385_4, this:r1385_1
# 1385| mu1385_6(unknown) = ^CallSideEffect : ~m?
# 1385| v1385_7(void) = ^BufferReadSideEffect[-1] : &:r1385_1, ~m?
# 1385| mu1385_8(destructor_only) = ^IndirectMayWriteSideEffect[-1] : &:r1385_1
# 1386| r1386_1(glval<destructor_only>) = VariableAddress[#temp1386:5] :
# 1386| r1386_2(glval<unknown>) = FunctionAddress[returnValue] :
# 1386| r1386_3(destructor_only) = Call[returnValue] : func:r1386_2
# 1386| mu1386_4(unknown) = ^CallSideEffect : ~m?
# 1386| mu1386_5(destructor_only) = Store[#temp1386:5] : &:r1386_1, r1386_3
# 1386| r1386_6(glval<unknown>) = FunctionAddress[method] :
# 1386| v1386_7(void) = Call[method] : func:r1386_6, this:r1386_1
# 1386| mu1386_8(unknown) = ^CallSideEffect : ~m?
# 1386| v1386_9(void) = ^BufferReadSideEffect[-1] : &:r1386_1, ~m?
# 1386| mu1386_10(destructor_only) = ^IndirectMayWriteSideEffect[-1] : &:r1386_1
# 1388| r1388_1(glval<destructor_only>) = VariableAddress[#temp1388:5] :
# 1388| r1388_2(glval<unknown>) = FunctionAddress[defaultConstruct] :
# 1388| r1388_3(destructor_only) = Call[defaultConstruct] : func:r1388_2
# 1388| mu1388_4(unknown) = ^CallSideEffect : ~m?
# 1388| mu1388_5(destructor_only) = Store[#temp1388:5] : &:r1388_1, r1388_3
# 1388| r1388_6(destructor_only) = Load[#temp1388:5] : &:r1388_1, ~m?
# 1389| v1389_1(void) = NoOp :
# 1379| v1379_4(void) = ReturnVoid :
# 1379| v1379_5(void) = AliasedUse : ~m?
# 1379| v1379_6(void) = ExitFunction :
# 1391| void temporary_copy_constructor()
# 1391| Block 0
# 1391| v1391_1(void) = EnterFunction :
# 1391| mu1391_2(unknown) = AliasedDefinition :
# 1391| mu1391_3(unknown) = InitializeNonLocal :
# 1392| r1392_1(glval<copy_constructor>) = VariableAddress[d] :
# 1392| r1392_2(glval<unknown>) = FunctionAddress[returnValue] :
# 1392| r1392_3(copy_constructor) = Call[returnValue] : func:r1392_2
# 1392| mu1392_4(unknown) = ^CallSideEffect : ~m?
# 1392| mu1392_5(copy_constructor) = Store[d] : &:r1392_1, r1392_3
# 1393| r1393_1(glval<copy_constructor &>) = VariableAddress[rd] :
# 1393| r1393_2(glval<copy_constructor>) = VariableAddress[#temp1393:34] :
# 1393| r1393_3(glval<unknown>) = FunctionAddress[returnValue] :
# 1393| r1393_4(copy_constructor) = Call[returnValue] : func:r1393_3
# 1393| mu1393_5(unknown) = ^CallSideEffect : ~m?
# 1393| mu1393_6(copy_constructor) = Store[#temp1393:34] : &:r1393_2, r1393_4
# 1393| r1393_7(glval<copy_constructor>) = Convert : r1393_2
# 1393| r1393_8(copy_constructor &) = CopyValue : r1393_7
# 1393| mu1393_9(copy_constructor &) = Store[rd] : &:r1393_1, r1393_8
# 1394| r1394_1(glval<copy_constructor>) = VariableAddress[d2] :
# 1394| mu1394_2(copy_constructor) = Uninitialized[d2] : &:r1394_1
# 1394| r1394_3(glval<unknown>) = FunctionAddress[copy_constructor] :
# 1394| v1394_4(void) = Call[copy_constructor] : func:r1394_3, this:r1394_1
# 1394| mu1394_5(unknown) = ^CallSideEffect : ~m?
# 1394| mu1394_6(copy_constructor) = ^IndirectMayWriteSideEffect[-1] : &:r1394_1
# 1395| r1395_1(glval<unknown>) = FunctionAddress[acceptRef] :
# 1395| r1395_2(glval<copy_constructor>) = VariableAddress[d] :
# 1395| r1395_3(glval<copy_constructor>) = Convert : r1395_2
# 1395| r1395_4(copy_constructor &) = CopyValue : r1395_3
# 1395| v1395_5(void) = Call[acceptRef] : func:r1395_1, 0:r1395_4
# 1395| mu1395_6(unknown) = ^CallSideEffect : ~m?
# 1395| v1395_7(void) = ^BufferReadSideEffect[0] : &:r1395_4, ~m?
# 1395| mu1395_8(unknown) = ^BufferMayWriteSideEffect[0] : &:r1395_4
# 1396| r1396_1(glval<unknown>) = FunctionAddress[acceptValue] :
# 1396| r1396_2(glval<copy_constructor>) = VariableAddress[#temp1396:17] :
# 1396| mu1396_3(copy_constructor) = Uninitialized[#temp1396:17] : &:r1396_2
# 1396| r1396_4(glval<unknown>) = FunctionAddress[copy_constructor] :
# 1396| r1396_5(glval<copy_constructor>) = VariableAddress[d] :
# 1396| r1396_6(glval<copy_constructor>) = Convert : r1396_5
# 1396| r1396_7(copy_constructor &) = CopyValue : r1396_6
# 1396| v1396_8(void) = Call[copy_constructor] : func:r1396_4, this:r1396_2, 0:r1396_7
# 1396| mu1396_9(unknown) = ^CallSideEffect : ~m?
# 1396| mu1396_10(copy_constructor) = ^IndirectMayWriteSideEffect[-1] : &:r1396_2
# 1396| v1396_11(void) = ^BufferReadSideEffect[0] : &:r1396_7, ~m?
# 1396| mu1396_12(unknown) = ^BufferMayWriteSideEffect[0] : &:r1396_7
# 1396| r1396_13(copy_constructor) = Load[#temp1396:17] : &:r1396_2, ~m?
# 1396| v1396_14(void) = Call[acceptValue] : func:r1396_1, 0:r1396_13
# 1396| mu1396_15(unknown) = ^CallSideEffect : ~m?
# 1397| r1397_1(glval<copy_constructor>) = VariableAddress[#temp1397:5] :
# 1397| mu1397_2(copy_constructor) = Uninitialized[#temp1397:5] : &:r1397_1
# 1397| r1397_3(glval<unknown>) = FunctionAddress[copy_constructor] :
# 1397| v1397_4(void) = Call[copy_constructor] : func:r1397_3, this:r1397_1
# 1397| mu1397_5(unknown) = ^CallSideEffect : ~m?
# 1397| mu1397_6(copy_constructor) = ^IndirectMayWriteSideEffect[-1] : &:r1397_1
# 1397| r1397_7(glval<unknown>) = FunctionAddress[method] :
# 1397| v1397_8(void) = Call[method] : func:r1397_7, this:r1397_1
# 1397| mu1397_9(unknown) = ^CallSideEffect : ~m?
# 1397| v1397_10(void) = ^BufferReadSideEffect[-1] : &:r1397_1, ~m?
# 1397| mu1397_11(copy_constructor) = ^IndirectMayWriteSideEffect[-1] : &:r1397_1
# 1398| r1398_1(glval<copy_constructor>) = VariableAddress[#temp1398:5] :
# 1398| r1398_2(glval<unknown>) = FunctionAddress[returnValue] :
# 1398| r1398_3(copy_constructor) = Call[returnValue] : func:r1398_2
# 1398| mu1398_4(unknown) = ^CallSideEffect : ~m?
# 1398| mu1398_5(copy_constructor) = Store[#temp1398:5] : &:r1398_1, r1398_3
# 1398| r1398_6(glval<unknown>) = FunctionAddress[method] :
# 1398| v1398_7(void) = Call[method] : func:r1398_6, this:r1398_1
# 1398| mu1398_8(unknown) = ^CallSideEffect : ~m?
# 1398| v1398_9(void) = ^BufferReadSideEffect[-1] : &:r1398_1, ~m?
# 1398| mu1398_10(copy_constructor) = ^IndirectMayWriteSideEffect[-1] : &:r1398_1
# 1399| r1399_1(glval<copy_constructor>) = VariableAddress[#temp1399:5] :
# 1399| r1399_2(glval<unknown>) = FunctionAddress[defaultConstruct] :
# 1399| r1399_3(copy_constructor) = Call[defaultConstruct] : func:r1399_2
# 1399| mu1399_4(unknown) = ^CallSideEffect : ~m?
# 1399| mu1399_5(copy_constructor) = Store[#temp1399:5] : &:r1399_1, r1399_3
# 1399| r1399_6(copy_constructor) = Load[#temp1399:5] : &:r1399_1, ~m?
# 1401| r1401_1(glval<int>) = VariableAddress[y] :
# 1401| r1401_2(glval<copy_constructor>) = VariableAddress[#temp1401:13] :
# 1401| r1401_3(glval<unknown>) = FunctionAddress[returnValue] :
# 1401| r1401_4(copy_constructor) = Call[returnValue] : func:r1401_3
# 1401| mu1401_5(unknown) = ^CallSideEffect : ~m?
# 1401| mu1401_6(copy_constructor) = Store[#temp1401:13] : &:r1401_2, r1401_4
# 1401| r1401_7(glval<int>) = FieldAddress[y] : r1401_2
# 1401| r1401_8(int) = Load[?] : &:r1401_7, ~m?
# 1401| mu1401_9(int) = Store[y] : &:r1401_1, r1401_8
# 1402| v1402_1(void) = NoOp :
# 1391| v1391_4(void) = ReturnVoid :
# 1391| v1391_5(void) = AliasedUse : ~m?
# 1391| v1391_6(void) = ExitFunction :
# 1404| void temporary_point()
# 1404| Block 0
# 1404| v1404_1(void) = EnterFunction :
# 1404| mu1404_2(unknown) = AliasedDefinition :
# 1404| mu1404_3(unknown) = InitializeNonLocal :
# 1405| r1405_1(glval<Point>) = VariableAddress[p] :
# 1405| r1405_2(glval<unknown>) = FunctionAddress[returnValue] :
# 1405| r1405_3(Point) = Call[returnValue] : func:r1405_2
# 1405| mu1405_4(unknown) = ^CallSideEffect : ~m?
# 1405| mu1405_5(Point) = Store[p] : &:r1405_1, r1405_3
# 1406| r1406_1(glval<Point &>) = VariableAddress[rp] :
# 1406| r1406_2(glval<Point>) = VariableAddress[#temp1406:23] :
# 1406| r1406_3(glval<unknown>) = FunctionAddress[returnValue] :
# 1406| r1406_4(Point) = Call[returnValue] : func:r1406_3
# 1406| mu1406_5(unknown) = ^CallSideEffect : ~m?
# 1406| mu1406_6(Point) = Store[#temp1406:23] : &:r1406_2, r1406_4
# 1406| r1406_7(glval<Point>) = Convert : r1406_2
# 1406| r1406_8(Point &) = CopyValue : r1406_7
# 1406| mu1406_9(Point &) = Store[rp] : &:r1406_1, r1406_8
# 1408| r1408_1(glval<unknown>) = FunctionAddress[acceptRef] :
# 1408| r1408_2(glval<Point>) = VariableAddress[p] :
# 1408| r1408_3(glval<Point>) = Convert : r1408_2
# 1408| r1408_4(Point &) = CopyValue : r1408_3
# 1408| v1408_5(void) = Call[acceptRef] : func:r1408_1, 0:r1408_4
# 1408| mu1408_6(unknown) = ^CallSideEffect : ~m?
# 1408| v1408_7(void) = ^BufferReadSideEffect[0] : &:r1408_4, ~m?
# 1408| mu1408_8(unknown) = ^BufferMayWriteSideEffect[0] : &:r1408_4
# 1409| r1409_1(glval<unknown>) = FunctionAddress[acceptValue] :
# 1409| r1409_2(glval<Point>) = VariableAddress[p] :
# 1409| r1409_3(Point) = Load[p] : &:r1409_2, ~m?
# 1409| v1409_4(void) = Call[acceptValue] : func:r1409_1, 0:r1409_3
# 1409| mu1409_5(unknown) = ^CallSideEffect : ~m?
# 1410| r1410_1(int) = Constant[0] :
# 1411| r1411_1(glval<int>) = VariableAddress[y] :
# 1411| r1411_2(glval<unknown>) = FunctionAddress[returnValue] :
# 1411| r1411_3(Point) = Call[returnValue] : func:r1411_2
# 1411| mu1411_4(unknown) = ^CallSideEffect : ~m?
# 1411| r1411_5(glval<Point>) = VariableAddress[#temp1411:13] :
# 1411| mu1411_6(Point) = Store[#temp1411:13] : &:r1411_5, r1411_3
# 1411| r1411_7(glval<int>) = FieldAddress[y] : r1411_5
# 1411| r1411_8(int) = Load[?] : &:r1411_7, ~m?
# 1411| mu1411_9(int) = Store[y] : &:r1411_1, r1411_8
# 1413| r1413_1(glval<unknown>) = FunctionAddress[defaultConstruct] :
# 1413| r1413_2(Point) = Call[defaultConstruct] : func:r1413_1
# 1413| mu1413_3(unknown) = ^CallSideEffect : ~m?
# 1414| v1414_1(void) = NoOp :
# 1404| v1404_4(void) = ReturnVoid :
# 1404| v1404_5(void) = AliasedUse : ~m?
# 1404| v1404_6(void) = ExitFunction :
# 1421| void temporary_unusual_fields()
# 1421| Block 0
# 1421| v1421_1(void) = EnterFunction :
# 1421| mu1421_2(unknown) = AliasedDefinition :
# 1421| mu1421_3(unknown) = InitializeNonLocal :
# 1422| r1422_1(glval<int &>) = VariableAddress[rx] :
# 1422| r1422_2(glval<unknown>) = FunctionAddress[returnValue] :
# 1422| r1422_3(UnusualFields) = Call[returnValue] : func:r1422_2
# 1422| mu1422_4(unknown) = ^CallSideEffect : ~m?
# 1422| r1422_5(glval<UnusualFields>) = VariableAddress[#temp1422:21] :
# 1422| mu1422_6(UnusualFields) = Store[#temp1422:21] : &:r1422_5, r1422_3
# 1422| r1422_7(glval<int &>) = FieldAddress[r] : r1422_5
# 1422| r1422_8(int &) = Load[?] : &:r1422_7, ~m?
# 1422| r1422_9(glval<int>) = CopyValue : r1422_8
# 1422| r1422_10(glval<int>) = Convert : r1422_9
# 1422| r1422_11(int &) = CopyValue : r1422_10
# 1422| mu1422_12(int &) = Store[rx] : &:r1422_1, r1422_11
# 1423| r1423_1(glval<int>) = VariableAddress[x] :
# 1423| r1423_2(glval<unknown>) = FunctionAddress[returnValue] :
# 1423| r1423_3(UnusualFields) = Call[returnValue] : func:r1423_2
# 1423| mu1423_4(unknown) = ^CallSideEffect : ~m?
# 1423| r1423_5(glval<UnusualFields>) = VariableAddress[#temp1423:13] :
# 1423| mu1423_6(UnusualFields) = Store[#temp1423:13] : &:r1423_5, r1423_3
# 1423| r1423_7(glval<int &>) = FieldAddress[r] : r1423_5
# 1423| r1423_8(int &) = Load[?] : &:r1423_7, ~m?
# 1423| r1423_9(int) = Load[?] : &:r1423_8, ~m?
# 1423| mu1423_10(int) = Store[x] : &:r1423_1, r1423_9
# 1425| r1425_1(glval<float &>) = VariableAddress[rf] :
# 1425| r1425_2(glval<unknown>) = FunctionAddress[returnValue] :
# 1425| r1425_3(UnusualFields) = Call[returnValue] : func:r1425_2
# 1425| mu1425_4(unknown) = ^CallSideEffect : ~m?
# 1425| r1425_5(glval<UnusualFields>) = VariableAddress[#temp1425:23] :
# 1425| mu1425_6(UnusualFields) = Store[#temp1425:23] : &:r1425_5, r1425_3
# 1425| r1425_7(glval<float[10]>) = FieldAddress[a] : r1425_5
# 1425| r1425_8(float *) = Convert : r1425_7
# 1425| r1425_9(int) = Constant[3] :
# 1425| r1425_10(glval<float>) = PointerAdd[4] : r1425_8, r1425_9
# 1425| r1425_11(glval<float>) = Convert : r1425_10
# 1425| r1425_12(float &) = CopyValue : r1425_11
# 1425| mu1425_13(float &) = Store[rf] : &:r1425_1, r1425_12
# 1426| r1426_1(glval<float>) = VariableAddress[f] :
# 1426| r1426_2(glval<unknown>) = FunctionAddress[returnValue] :
# 1426| r1426_3(UnusualFields) = Call[returnValue] : func:r1426_2
# 1426| mu1426_4(unknown) = ^CallSideEffect : ~m?
# 1426| r1426_5(glval<UnusualFields>) = VariableAddress[#temp1426:15] :
# 1426| mu1426_6(UnusualFields) = Store[#temp1426:15] : &:r1426_5, r1426_3
# 1426| r1426_7(glval<float[10]>) = FieldAddress[a] : r1426_5
# 1426| r1426_8(float *) = Convert : r1426_7
# 1426| r1426_9(int) = Constant[5] :
# 1426| r1426_10(glval<float>) = PointerAdd[4] : r1426_8, r1426_9
# 1426| r1426_11(float) = Load[?] : &:r1426_10, ~m?
# 1426| mu1426_12(float) = Store[f] : &:r1426_1, r1426_11
# 1427| v1427_1(void) = NoOp :
# 1421| v1421_4(void) = ReturnVoid :
# 1421| v1421_5(void) = AliasedUse : ~m?
# 1421| v1421_6(void) = ExitFunction :
# 1443| void temporary_hierarchy()
# 1443| Block 0
# 1443| v1443_1(void) = EnterFunction :
# 1443| mu1443_2(unknown) = AliasedDefinition :
# 1443| mu1443_3(unknown) = InitializeNonLocal :
# 1444| r1444_1(glval<POD_Base>) = VariableAddress[b] :
# 1444| r1444_2(glval<unknown>) = FunctionAddress[returnValue] :
# 1444| r1444_3(POD_Middle) = Call[returnValue] : func:r1444_2
# 1444| mu1444_4(unknown) = ^CallSideEffect : ~m?
# 1444| r1444_5(glval<POD_Middle>) = VariableAddress[#temp1444:18] :
# 1444| mu1444_6(POD_Middle) = Store[#temp1444:18] : &:r1444_5, r1444_3
# 1444| r1444_7(glval<POD_Base>) = ConvertToNonVirtualBase[POD_Middle : POD_Base] : r1444_5
# 1444| r1444_8(POD_Base) = Load[?] : &:r1444_7, ~m?
# 1444| mu1444_9(POD_Base) = Store[b] : &:r1444_1, r1444_8
# 1445| r1445_1(glval<POD_Derived>) = VariableAddress[#temp1445:9] :
# 1445| r1445_2(glval<unknown>) = FunctionAddress[returnValue] :
# 1445| r1445_3(POD_Derived) = Call[returnValue] : func:r1445_2
# 1445| mu1445_4(unknown) = ^CallSideEffect : ~m?
# 1445| mu1445_5(POD_Derived) = Store[#temp1445:9] : &:r1445_1, r1445_3
# 1445| r1445_6(glval<POD_Middle>) = ConvertToNonVirtualBase[POD_Derived : POD_Middle] : r1445_1
# 1445| r1445_7(glval<POD_Base>) = ConvertToNonVirtualBase[POD_Middle : POD_Base] : r1445_6
# 1445| r1445_8(POD_Base) = Load[?] : &:r1445_7, ~m?
# 1445| r1445_9(glval<POD_Base>) = VariableAddress[b] :
# 1445| mu1445_10(POD_Base) = Store[b] : &:r1445_9, r1445_8
# 1446| r1446_1(glval<int>) = VariableAddress[x] :
# 1446| r1446_2(glval<unknown>) = FunctionAddress[returnValue] :
# 1446| r1446_3(POD_Derived) = Call[returnValue] : func:r1446_2
# 1446| mu1446_4(unknown) = ^CallSideEffect : ~m?
# 1446| r1446_5(glval<POD_Derived>) = VariableAddress[#temp1446:13] :
# 1446| mu1446_6(POD_Derived) = Store[#temp1446:13] : &:r1446_5, r1446_3
# 1446| r1446_7(glval<POD_Middle>) = ConvertToNonVirtualBase[POD_Derived : POD_Middle] : r1446_5
# 1446| r1446_8(glval<POD_Base>) = ConvertToNonVirtualBase[POD_Middle : POD_Base] : r1446_7
# 1446| r1446_9(glval<int>) = FieldAddress[x] : r1446_8
# 1446| r1446_10(int) = Load[?] : &:r1446_9, ~m?
# 1446| mu1446_11(int) = Store[x] : &:r1446_1, r1446_10
# 1447| r1447_1(glval<float>) = VariableAddress[f] :
# 1447| r1447_2(glval<unknown>) = FunctionAddress[returnValue] :
# 1447| r1447_3(POD_Derived) = Call[returnValue] : func:r1447_2
# 1447| mu1447_4(unknown) = ^CallSideEffect : ~m?
# 1447| r1447_5(glval<POD_Derived>) = VariableAddress[#temp1447:16] :
# 1447| mu1447_6(POD_Derived) = Store[#temp1447:16] : &:r1447_5, r1447_3
# 1447| r1447_7(glval<POD_Middle>) = ConvertToNonVirtualBase[POD_Derived : POD_Middle] : r1447_5
# 1447| r1447_8(glval<POD_Base>) = ConvertToNonVirtualBase[POD_Middle : POD_Base] : r1447_7
# 1447| r1447_9(glval<unknown>) = FunctionAddress[f] :
# 1447| r1447_10(float) = Call[f] : func:r1447_9, this:r1447_8
# 1447| mu1447_11(unknown) = ^CallSideEffect : ~m?
# 1447| v1447_12(void) = ^BufferReadSideEffect[-1] : &:r1447_8, ~m?
# 1447| mu1447_13(POD_Base) = ^IndirectMayWriteSideEffect[-1] : &:r1447_8
# 1447| mu1447_14(float) = Store[f] : &:r1447_1, r1447_10
# 1448| v1448_1(void) = NoOp :
# 1443| v1443_4(void) = ReturnVoid :
# 1443| v1443_5(void) = AliasedUse : ~m?
# 1443| v1443_6(void) = ExitFunction :
perf-regression.cpp:
# 6| void Big::Big()
# 6| Block 0

View File

@@ -1,8 +1,4 @@
missingOperand
| ir.cpp:809:7:809:13 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() |
| ir.cpp:810:7:810:26 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() |
| ir.cpp:823:7:823:13 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() |
| ir.cpp:824:7:824:26 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() |
unexpectedOperand
duplicateOperand
missingPhiOperand
@@ -25,6 +21,8 @@ notMarkedAsConflated
wronglyMarkedAsConflated
invalidOverlap
nonUniqueEnclosingIRFunction
fieldAddressOnNonPointer
thisArgumentIsNonPointer
missingCanonicalLanguageType
multipleCanonicalLanguageTypes
missingIRType

View File

@@ -1,8 +1,4 @@
missingOperand
| ir.cpp:809:7:809:13 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() |
| ir.cpp:810:7:810:26 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() |
| ir.cpp:823:7:823:13 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() |
| ir.cpp:824:7:824:26 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() |
unexpectedOperand
duplicateOperand
missingPhiOperand
@@ -25,6 +21,8 @@ notMarkedAsConflated
wronglyMarkedAsConflated
invalidOverlap
nonUniqueEnclosingIRFunction
fieldAddressOnNonPointer
thisArgumentIsNonPointer
missingCanonicalLanguageType
multipleCanonicalLanguageTypes
missingIRType

View File

@@ -21,6 +21,8 @@ notMarkedAsConflated
wronglyMarkedAsConflated
invalidOverlap
nonUniqueEnclosingIRFunction
fieldAddressOnNonPointer
thisArgumentIsNonPointer
missingCanonicalLanguageType
multipleCanonicalLanguageTypes
missingIRType

View File

@@ -21,6 +21,8 @@ notMarkedAsConflated
wronglyMarkedAsConflated
invalidOverlap
nonUniqueEnclosingIRFunction
fieldAddressOnNonPointer
thisArgumentIsNonPointer
missingCanonicalLanguageType
multipleCanonicalLanguageTypes
missingIRType

View File

@@ -21,6 +21,8 @@ notMarkedAsConflated
wronglyMarkedAsConflated
invalidOverlap
nonUniqueEnclosingIRFunction
fieldAddressOnNonPointer
thisArgumentIsNonPointer
missingCanonicalLanguageType
multipleCanonicalLanguageTypes
missingIRType

View File

@@ -21,6 +21,8 @@ notMarkedAsConflated
wronglyMarkedAsConflated
invalidOverlap
nonUniqueEnclosingIRFunction
fieldAddressOnNonPointer
thisArgumentIsNonPointer
missingCanonicalLanguageType
multipleCanonicalLanguageTypes
missingIRType

View File

@@ -10,6 +10,9 @@
| segfault.cpp:25:58:25:64 | 0 | segfault.cpp:12:8:12:12 | index |
| segfault.cpp:25:58:25:64 | 0 | segfault.cpp:12:8:12:12 | index |
| segfault.cpp:25:58:25:64 | 0 | segfault.cpp:12:8:12:12 | index |
| segfault.cpp:25:58:25:64 | temporary object | segfault.cpp:12:8:12:12 | index |
| segfault.cpp:25:58:25:64 | temporary object | segfault.cpp:12:8:12:12 | index |
| segfault.cpp:25:58:25:64 | temporary object | segfault.cpp:12:8:12:12 | index |
| segfault.cpp:29:23:29:44 | 0 | file://:0:0:0:0 | ..:: * |
| segfault.cpp:29:23:29:44 | 0 | file://:0:0:0:0 | ..:: * |
| segfault.cpp:29:23:29:44 | constructor init of field second | file://:0:0:0:0 | ..:: * |
@@ -23,10 +26,14 @@
| segfault.cpp:35:9:35:56 | call to S | file://:0:0:0:0 | void |
| segfault.cpp:35:9:35:56 | new | file://:0:0:0:0 | S<..(*)(..)> * |
| segfault.cpp:35:24:35:46 | 0 | segfault.cpp:9:8:9:28 | piecewise_construct_t |
| segfault.cpp:35:24:35:46 | temporary object | segfault.cpp:9:8:9:28 | piecewise_construct_t |
| segfault.cpp:35:49:35:55 | 0 | segfault.cpp:15:7:15:11 | tuple |
| segfault.cpp:35:49:35:55 | temporary object | segfault.cpp:15:7:15:11 | tuple |
| segfault.cpp:40:5:40:5 | x | file://:0:0:0:0 | S<int F::*> * |
| segfault.cpp:40:5:40:54 | ... = ... | file://:0:0:0:0 | S<int F::*> * |
| segfault.cpp:40:9:40:54 | call to S | file://:0:0:0:0 | void |
| segfault.cpp:40:9:40:54 | new | file://:0:0:0:0 | S<int F::*> * |
| segfault.cpp:40:22:40:44 | 0 | segfault.cpp:9:8:9:28 | piecewise_construct_t |
| segfault.cpp:40:22:40:44 | temporary object | segfault.cpp:9:8:9:28 | piecewise_construct_t |
| segfault.cpp:40:47:40:53 | 0 | segfault.cpp:15:7:15:11 | tuple |
| segfault.cpp:40:47:40:53 | temporary object | segfault.cpp:15:7:15:11 | tuple |

View File

@@ -1,3 +1,4 @@
| 0 | 1 | file://:0:0:0:0 | temporary object | None |
| 2 | 1 | question_mark_colon.c:2:7:2:7 | f | None |
| 4 | 1 | question_mark_colon.c:4:14:8:1 | { ... } | declaration |
| 4 | 17 | question_mark_colon.c:4:6:4:6 | g | None |

View File

@@ -1,23 +1,4 @@
missingOperand
| conditional_destructors.cpp:30:9:30:13 | IndirectMayWriteSideEffect: call to C1 | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | conditional_destructors.cpp:29:6:29:7 | void f1() | void f1() |
| conditional_destructors.cpp:30:18:30:22 | IndirectMayWriteSideEffect: call to C1 | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | conditional_destructors.cpp:29:6:29:7 | void f1() | void f1() |
| conditional_destructors.cpp:33:9:33:13 | IndirectMayWriteSideEffect: call to C1 | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | conditional_destructors.cpp:29:6:29:7 | void f1() | void f1() |
| conditional_destructors.cpp:33:18:33:22 | IndirectMayWriteSideEffect: call to C1 | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | conditional_destructors.cpp:29:6:29:7 | void f1() | void f1() |
| conditional_destructors.cpp:39:9:39:13 | IndirectMayWriteSideEffect: call to C2 | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | conditional_destructors.cpp:38:6:38:7 | void f2() | void f2() |
| conditional_destructors.cpp:39:18:39:22 | IndirectMayWriteSideEffect: call to C2 | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | conditional_destructors.cpp:38:6:38:7 | void f2() | void f2() |
| conditional_destructors.cpp:42:9:42:13 | IndirectMayWriteSideEffect: call to C2 | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | conditional_destructors.cpp:38:6:38:7 | void f2() | void f2() |
| conditional_destructors.cpp:42:18:42:22 | IndirectMayWriteSideEffect: call to C2 | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | conditional_destructors.cpp:38:6:38:7 | void f2() | void f2() |
| cpp11.cpp:77:19:77:21 | IndirectMayWriteSideEffect: call to Val | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | cpp11.cpp:76:8:76:8 | void lambda::apply<(void lambda::apply2<int(*)(lambda::Val, lambda::Val)>(int(*)(lambda::Val, lambda::Val), lambda::Val, lambda::Val))::(lambda [] type at line 82, col. 17)>(lambda::Val, (void lambda::apply2<int(*)(lambda::Val, lambda::Val)>(int(*)(lambda::Val, lambda::Val), lambda::Val, lambda::Val))::(lambda [] type at line 82, col. 17)) | void lambda::apply<(void lambda::apply2<int(*)(lambda::Val, lambda::Val)>(int(*)(lambda::Val, lambda::Val), lambda::Val, lambda::Val))::(lambda [] type at line 82, col. 17)>(lambda::Val, (void lambda::apply2<int(*)(lambda::Val, lambda::Val)>(int(*)(lambda::Val, lambda::Val), lambda::Val, lambda::Val))::(lambda [] type at line 82, col. 17)) |
| cpp11.cpp:82:11:82:14 | IndirectMayWriteSideEffect: call to Val | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | cpp11.cpp:81:8:81:8 | void lambda::apply2<int(*)(lambda::Val, lambda::Val)>(int(*)(lambda::Val, lambda::Val), lambda::Val, lambda::Val) | void lambda::apply2<int(*)(lambda::Val, lambda::Val)>(int(*)(lambda::Val, lambda::Val), lambda::Val, lambda::Val) |
| cpp11.cpp:82:45:82:48 | IndirectMayWriteSideEffect: call to Val | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | cpp11.cpp:82:20:82:20 | void (void lambda::apply2<int(*)(lambda::Val, lambda::Val)>(int(*)(lambda::Val, lambda::Val), lambda::Val, lambda::Val))::(lambda [] type at line 82, col. 17)::operator()(lambda::Val) const | void (void lambda::apply2<int(*)(lambda::Val, lambda::Val)>(int(*)(lambda::Val, lambda::Val), lambda::Val, lambda::Val))::(lambda [] type at line 82, col. 17)::operator()(lambda::Val) const |
| cpp11.cpp:82:51:82:51 | IndirectMayWriteSideEffect: call to Val | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | cpp11.cpp:82:20:82:20 | void (void lambda::apply2<int(*)(lambda::Val, lambda::Val)>(int(*)(lambda::Val, lambda::Val), lambda::Val, lambda::Val))::(lambda [] type at line 82, col. 17)::operator()(lambda::Val) const | void (void lambda::apply2<int(*)(lambda::Val, lambda::Val)>(int(*)(lambda::Val, lambda::Val), lambda::Val, lambda::Val))::(lambda [] type at line 82, col. 17)::operator()(lambda::Val) const |
| cpp11.cpp:88:25:88:30 | IndirectMayWriteSideEffect: call to Val | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | cpp11.cpp:87:8:87:11 | void lambda::main() | void lambda::main() |
| cpp11.cpp:88:33:88:38 | IndirectMayWriteSideEffect: call to Val | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | cpp11.cpp:87:8:87:11 | void lambda::main() | void lambda::main() |
| destructors.cpp:51:36:51:38 | IndirectMayWriteSideEffect: call to C | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | destructors.cpp:49:7:49:7 | int cond_destruct::f(int) | int cond_destruct::f(int) |
| ir.cpp:809:7:809:13 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() |
| ir.cpp:810:7:810:26 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() |
| ir.cpp:823:7:823:13 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() |
| ir.cpp:824:7:824:26 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() |
| misc.c:125:5:125:11 | CopyValue: (statement expression) | Instruction 'CopyValue' is missing an expected operand with tag 'Unary' in function '$@'. | misc.c:97:6:97:10 | void misc3() | void misc3() |
unexpectedOperand
duplicateOperand
@@ -32,7 +13,6 @@ instructionWithoutSuccessor
| condition_decls.cpp:41:22:41:23 | Chi: call to BoxedInt | Instruction 'Chi: call to BoxedInt' has no successors in function '$@'. | condition_decls.cpp:40:6:40:20 | void while_decl_bind(int) | void while_decl_bind(int) |
| condition_decls.cpp:48:52:48:53 | Chi: call to BoxedInt | Instruction 'Chi: call to BoxedInt' has no successors in function '$@'. | condition_decls.cpp:47:6:47:18 | void for_decl_bind(int) | void for_decl_bind(int) |
| misc.c:171:10:171:13 | Uninitialized: definition of str2 | Instruction 'Uninitialized: definition of str2' has no successors in function '$@'. | misc.c:168:6:168:8 | void vla() | void vla() |
| misc.c:219:47:219:48 | InitializeIndirection: sp | Instruction 'InitializeIndirection: sp' has no successors in function '$@'. | misc.c:219:5:219:26 | int assign_designated_init(someStruct*) | int assign_designated_init(someStruct*) |
| ms_try_except.cpp:3:9:3:9 | Uninitialized: definition of x | Instruction 'Uninitialized: definition of x' has no successors in function '$@'. | ms_try_except.cpp:2:6:2:18 | void ms_try_except(int) | void ms_try_except(int) |
| ms_try_mix.cpp:11:12:11:15 | Chi: call to C | Instruction 'Chi: call to C' has no successors in function '$@'. | ms_try_mix.cpp:10:6:10:18 | void ms_except_mix(int) | void ms_except_mix(int) |
| ms_try_mix.cpp:28:12:28:15 | Chi: call to C | Instruction 'Chi: call to C' has no successors in function '$@'. | ms_try_mix.cpp:27:6:27:19 | void ms_finally_mix(int) | void ms_finally_mix(int) |
@@ -113,6 +93,11 @@ notMarkedAsConflated
wronglyMarkedAsConflated
invalidOverlap
nonUniqueEnclosingIRFunction
fieldAddressOnNonPointer
thisArgumentIsNonPointer
| pmcallexpr.cpp:8:2:8:15 | Call: call to expression | Call instruction 'Call: call to expression' has a `this` argument operand that is not an address, in function '$@'. | array_delete.cpp:5:6:5:6 | void f() | void f() |
| pointer_to_member.cpp:23:5:23:54 | Call: call to expression | Call instruction 'Call: call to expression' has a `this` argument operand that is not an address, in function '$@'. | pointer_to_member.cpp:14:5:14:9 | int usePM(int PM::*) | int usePM(int PM::*) |
| pointer_to_member.cpp:24:5:24:49 | Call: call to expression | Call instruction 'Call: call to expression' has a `this` argument operand that is not an address, in function '$@'. | pointer_to_member.cpp:14:5:14:9 | int usePM(int PM::*) | int usePM(int PM::*) |
missingCanonicalLanguageType
multipleCanonicalLanguageTypes
missingIRType

View File

@@ -1558,6 +1558,9 @@ postWithInFlow
| misc.c:158:14:158:18 | Chi | PostUpdateNode should not be the target of local flow. |
| misc.c:160:31:160:33 | Chi | PostUpdateNode should not be the target of local flow. |
| misc.c:160:31:160:33 | Chi | PostUpdateNode should not be the target of local flow. |
| misc.c:220:3:223:3 | Chi | PostUpdateNode should not be the target of local flow. |
| misc.c:221:10:221:10 | Chi | PostUpdateNode should not be the target of local flow. |
| misc.c:222:10:222:10 | Chi | PostUpdateNode should not be the target of local flow. |
| range_analysis.c:102:5:102:15 | Chi | PostUpdateNode should not be the target of local flow. |
| static_init_templates.cpp:3:2:3:8 | Chi | PostUpdateNode should not be the target of local flow. |
| static_init_templates.cpp:21:2:21:12 | Chi | PostUpdateNode should not be the target of local flow. |

View File

@@ -3,29 +3,7 @@ missingOperand
| condition_decls.cpp:26:10:26:24 | CopyValue: (condition decl) | Instruction 'CopyValue' is missing an expected operand with tag 'Unary' in function '$@'. | condition_decls.cpp:25:6:25:21 | void switch_decl_bind(int) | void switch_decl_bind(int) |
| condition_decls.cpp:41:9:41:23 | CopyValue: (condition decl) | Instruction 'CopyValue' is missing an expected operand with tag 'Unary' in function '$@'. | condition_decls.cpp:40:6:40:20 | void while_decl_bind(int) | void while_decl_bind(int) |
| condition_decls.cpp:48:39:48:53 | CopyValue: (condition decl) | Instruction 'CopyValue' is missing an expected operand with tag 'Unary' in function '$@'. | condition_decls.cpp:47:6:47:18 | void for_decl_bind(int) | void for_decl_bind(int) |
| conditional_destructors.cpp:30:9:30:13 | IndirectMayWriteSideEffect: call to C1 | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | conditional_destructors.cpp:29:6:29:7 | void f1() | void f1() |
| conditional_destructors.cpp:30:18:30:22 | IndirectMayWriteSideEffect: call to C1 | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | conditional_destructors.cpp:29:6:29:7 | void f1() | void f1() |
| conditional_destructors.cpp:33:9:33:13 | IndirectMayWriteSideEffect: call to C1 | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | conditional_destructors.cpp:29:6:29:7 | void f1() | void f1() |
| conditional_destructors.cpp:33:18:33:22 | IndirectMayWriteSideEffect: call to C1 | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | conditional_destructors.cpp:29:6:29:7 | void f1() | void f1() |
| conditional_destructors.cpp:39:9:39:13 | IndirectMayWriteSideEffect: call to C2 | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | conditional_destructors.cpp:38:6:38:7 | void f2() | void f2() |
| conditional_destructors.cpp:39:18:39:22 | IndirectMayWriteSideEffect: call to C2 | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | conditional_destructors.cpp:38:6:38:7 | void f2() | void f2() |
| conditional_destructors.cpp:42:9:42:13 | IndirectMayWriteSideEffect: call to C2 | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | conditional_destructors.cpp:38:6:38:7 | void f2() | void f2() |
| conditional_destructors.cpp:42:18:42:22 | IndirectMayWriteSideEffect: call to C2 | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | conditional_destructors.cpp:38:6:38:7 | void f2() | void f2() |
| cpp11.cpp:77:19:77:21 | IndirectMayWriteSideEffect: call to Val | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | cpp11.cpp:76:8:76:8 | void lambda::apply<(void lambda::apply2<int(*)(lambda::Val, lambda::Val)>(int(*)(lambda::Val, lambda::Val), lambda::Val, lambda::Val))::(lambda [] type at line 82, col. 17)>(lambda::Val, (void lambda::apply2<int(*)(lambda::Val, lambda::Val)>(int(*)(lambda::Val, lambda::Val), lambda::Val, lambda::Val))::(lambda [] type at line 82, col. 17)) | void lambda::apply<(void lambda::apply2<int(*)(lambda::Val, lambda::Val)>(int(*)(lambda::Val, lambda::Val), lambda::Val, lambda::Val))::(lambda [] type at line 82, col. 17)>(lambda::Val, (void lambda::apply2<int(*)(lambda::Val, lambda::Val)>(int(*)(lambda::Val, lambda::Val), lambda::Val, lambda::Val))::(lambda [] type at line 82, col. 17)) |
| cpp11.cpp:82:11:82:14 | IndirectMayWriteSideEffect: call to Val | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | cpp11.cpp:81:8:81:8 | void lambda::apply2<int(*)(lambda::Val, lambda::Val)>(int(*)(lambda::Val, lambda::Val), lambda::Val, lambda::Val) | void lambda::apply2<int(*)(lambda::Val, lambda::Val)>(int(*)(lambda::Val, lambda::Val), lambda::Val, lambda::Val) |
| cpp11.cpp:82:45:82:48 | IndirectMayWriteSideEffect: call to Val | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | cpp11.cpp:82:20:82:20 | void (void lambda::apply2<int(*)(lambda::Val, lambda::Val)>(int(*)(lambda::Val, lambda::Val), lambda::Val, lambda::Val))::(lambda [] type at line 82, col. 17)::operator()(lambda::Val) const | void (void lambda::apply2<int(*)(lambda::Val, lambda::Val)>(int(*)(lambda::Val, lambda::Val), lambda::Val, lambda::Val))::(lambda [] type at line 82, col. 17)::operator()(lambda::Val) const |
| cpp11.cpp:82:51:82:51 | IndirectMayWriteSideEffect: call to Val | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | cpp11.cpp:82:20:82:20 | void (void lambda::apply2<int(*)(lambda::Val, lambda::Val)>(int(*)(lambda::Val, lambda::Val), lambda::Val, lambda::Val))::(lambda [] type at line 82, col. 17)::operator()(lambda::Val) const | void (void lambda::apply2<int(*)(lambda::Val, lambda::Val)>(int(*)(lambda::Val, lambda::Val), lambda::Val, lambda::Val))::(lambda [] type at line 82, col. 17)::operator()(lambda::Val) const |
| cpp11.cpp:88:25:88:30 | IndirectMayWriteSideEffect: call to Val | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | cpp11.cpp:87:8:87:11 | void lambda::main() | void lambda::main() |
| cpp11.cpp:88:33:88:38 | IndirectMayWriteSideEffect: call to Val | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | cpp11.cpp:87:8:87:11 | void lambda::main() | void lambda::main() |
| destructors.cpp:51:36:51:38 | IndirectMayWriteSideEffect: call to C | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | destructors.cpp:49:7:49:7 | int cond_destruct::f(int) | int cond_destruct::f(int) |
| ir.cpp:809:7:809:13 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() |
| ir.cpp:810:7:810:26 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() |
| ir.cpp:823:7:823:13 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() |
| ir.cpp:824:7:824:26 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() |
| misc.c:125:5:125:11 | CopyValue: (statement expression) | Instruction 'CopyValue' is missing an expected operand with tag 'Unary' in function '$@'. | misc.c:97:6:97:10 | void misc3() | void misc3() |
| misc.c:220:3:223:3 | Store: ... = ... | Instruction 'Store' is missing an expected operand with tag 'StoreValue' in function '$@'. | misc.c:219:5:219:26 | int assign_designated_init(someStruct*) | int assign_designated_init(someStruct*) |
| misc.c:220:9:223:3 | FieldAddress: {...} | Instruction 'FieldAddress' is missing an expected operand with tag 'Unary' in function '$@'. | misc.c:219:5:219:26 | int assign_designated_init(someStruct*) | int assign_designated_init(someStruct*) |
| misc.c:220:9:223:3 | FieldAddress: {...} | Instruction 'FieldAddress' is missing an expected operand with tag 'Unary' in function '$@'. | misc.c:219:5:219:26 | int assign_designated_init(someStruct*) | int assign_designated_init(someStruct*) |
| try_catch.cpp:23:5:23:18 | CopyValue: (statement expression) | Instruction 'CopyValue' is missing an expected operand with tag 'Unary' in function '$@'. | try_catch.cpp:19:6:19:23 | void throw_from_nonstmt(int) | void throw_from_nonstmt(int) |
unexpectedOperand
duplicateOperand
@@ -53,9 +31,6 @@ instructionWithoutSuccessor
| misc.c:174:17:174:22 | CallSideEffect: call to getInt | Instruction 'CallSideEffect: call to getInt' has no successors in function '$@'. | misc.c:168:6:168:8 | void vla() | void vla() |
| misc.c:174:30:174:35 | CallSideEffect: call to getInt | Instruction 'CallSideEffect: call to getInt' has no successors in function '$@'. | misc.c:168:6:168:8 | void vla() | void vla() |
| misc.c:174:55:174:60 | Store: (char ****)... | Instruction 'Store: (char ****)...' has no successors in function '$@'. | misc.c:168:6:168:8 | void vla() | void vla() |
| misc.c:219:47:219:48 | InitializeIndirection: sp | Instruction 'InitializeIndirection: sp' has no successors in function '$@'. | misc.c:219:5:219:26 | int assign_designated_init(someStruct*) | int assign_designated_init(someStruct*) |
| misc.c:221:10:221:10 | Store: 1 | Instruction 'Store: 1' has no successors in function '$@'. | misc.c:219:5:219:26 | int assign_designated_init(someStruct*) | int assign_designated_init(someStruct*) |
| misc.c:222:10:222:10 | Store: 2 | Instruction 'Store: 2' has no successors in function '$@'. | misc.c:219:5:219:26 | int assign_designated_init(someStruct*) | int assign_designated_init(someStruct*) |
| ms_try_except.cpp:3:9:3:9 | Uninitialized: definition of x | Instruction 'Uninitialized: definition of x' has no successors in function '$@'. | ms_try_except.cpp:2:6:2:18 | void ms_try_except(int) | void ms_try_except(int) |
| ms_try_except.cpp:7:13:7:17 | Store: ... = ... | Instruction 'Store: ... = ...' has no successors in function '$@'. | ms_try_except.cpp:2:6:2:18 | void ms_try_except(int) | void ms_try_except(int) |
| ms_try_except.cpp:9:19:9:19 | Load: j | Instruction 'Load: j' has no successors in function '$@'. | ms_try_except.cpp:2:6:2:18 | void ms_try_except(int) | void ms_try_except(int) |
@@ -168,6 +143,11 @@ notMarkedAsConflated
wronglyMarkedAsConflated
invalidOverlap
nonUniqueEnclosingIRFunction
fieldAddressOnNonPointer
thisArgumentIsNonPointer
| pmcallexpr.cpp:8:2:8:15 | Call: call to expression | Call instruction 'Call: call to expression' has a `this` argument operand that is not an address, in function '$@'. | array_delete.cpp:5:6:5:6 | void f() | void f() |
| pointer_to_member.cpp:23:5:23:54 | Call: call to expression | Call instruction 'Call: call to expression' has a `this` argument operand that is not an address, in function '$@'. | pointer_to_member.cpp:14:5:14:9 | int usePM(int PM::*) | int usePM(int PM::*) |
| pointer_to_member.cpp:24:5:24:49 | Call: call to expression | Call instruction 'Call: call to expression' has a `this` argument operand that is not an address, in function '$@'. | pointer_to_member.cpp:14:5:14:9 | int usePM(int PM::*) | int usePM(int PM::*) |
missingCanonicalLanguageType
multipleCanonicalLanguageTypes
missingIRType

View File

@@ -1,23 +1,4 @@
missingOperand
| conditional_destructors.cpp:30:9:30:13 | IndirectMayWriteSideEffect: call to C1 | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | conditional_destructors.cpp:29:6:29:7 | void f1() | void f1() |
| conditional_destructors.cpp:30:18:30:22 | IndirectMayWriteSideEffect: call to C1 | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | conditional_destructors.cpp:29:6:29:7 | void f1() | void f1() |
| conditional_destructors.cpp:33:9:33:13 | IndirectMayWriteSideEffect: call to C1 | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | conditional_destructors.cpp:29:6:29:7 | void f1() | void f1() |
| conditional_destructors.cpp:33:18:33:22 | IndirectMayWriteSideEffect: call to C1 | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | conditional_destructors.cpp:29:6:29:7 | void f1() | void f1() |
| conditional_destructors.cpp:39:9:39:13 | IndirectMayWriteSideEffect: call to C2 | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | conditional_destructors.cpp:38:6:38:7 | void f2() | void f2() |
| conditional_destructors.cpp:39:18:39:22 | IndirectMayWriteSideEffect: call to C2 | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | conditional_destructors.cpp:38:6:38:7 | void f2() | void f2() |
| conditional_destructors.cpp:42:9:42:13 | IndirectMayWriteSideEffect: call to C2 | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | conditional_destructors.cpp:38:6:38:7 | void f2() | void f2() |
| conditional_destructors.cpp:42:18:42:22 | IndirectMayWriteSideEffect: call to C2 | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | conditional_destructors.cpp:38:6:38:7 | void f2() | void f2() |
| cpp11.cpp:77:19:77:21 | IndirectMayWriteSideEffect: call to Val | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | cpp11.cpp:76:8:76:8 | void lambda::apply<(void lambda::apply2<int(*)(lambda::Val, lambda::Val)>(int(*)(lambda::Val, lambda::Val), lambda::Val, lambda::Val))::(lambda [] type at line 82, col. 17)>(lambda::Val, (void lambda::apply2<int(*)(lambda::Val, lambda::Val)>(int(*)(lambda::Val, lambda::Val), lambda::Val, lambda::Val))::(lambda [] type at line 82, col. 17)) | void lambda::apply<(void lambda::apply2<int(*)(lambda::Val, lambda::Val)>(int(*)(lambda::Val, lambda::Val), lambda::Val, lambda::Val))::(lambda [] type at line 82, col. 17)>(lambda::Val, (void lambda::apply2<int(*)(lambda::Val, lambda::Val)>(int(*)(lambda::Val, lambda::Val), lambda::Val, lambda::Val))::(lambda [] type at line 82, col. 17)) |
| cpp11.cpp:82:11:82:14 | IndirectMayWriteSideEffect: call to Val | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | cpp11.cpp:81:8:81:8 | void lambda::apply2<int(*)(lambda::Val, lambda::Val)>(int(*)(lambda::Val, lambda::Val), lambda::Val, lambda::Val) | void lambda::apply2<int(*)(lambda::Val, lambda::Val)>(int(*)(lambda::Val, lambda::Val), lambda::Val, lambda::Val) |
| cpp11.cpp:82:45:82:48 | IndirectMayWriteSideEffect: call to Val | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | cpp11.cpp:82:20:82:20 | void (void lambda::apply2<int(*)(lambda::Val, lambda::Val)>(int(*)(lambda::Val, lambda::Val), lambda::Val, lambda::Val))::(lambda [] type at line 82, col. 17)::operator()(lambda::Val) const | void (void lambda::apply2<int(*)(lambda::Val, lambda::Val)>(int(*)(lambda::Val, lambda::Val), lambda::Val, lambda::Val))::(lambda [] type at line 82, col. 17)::operator()(lambda::Val) const |
| cpp11.cpp:82:51:82:51 | IndirectMayWriteSideEffect: call to Val | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | cpp11.cpp:82:20:82:20 | void (void lambda::apply2<int(*)(lambda::Val, lambda::Val)>(int(*)(lambda::Val, lambda::Val), lambda::Val, lambda::Val))::(lambda [] type at line 82, col. 17)::operator()(lambda::Val) const | void (void lambda::apply2<int(*)(lambda::Val, lambda::Val)>(int(*)(lambda::Val, lambda::Val), lambda::Val, lambda::Val))::(lambda [] type at line 82, col. 17)::operator()(lambda::Val) const |
| cpp11.cpp:88:25:88:30 | IndirectMayWriteSideEffect: call to Val | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | cpp11.cpp:87:8:87:11 | void lambda::main() | void lambda::main() |
| cpp11.cpp:88:33:88:38 | IndirectMayWriteSideEffect: call to Val | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | cpp11.cpp:87:8:87:11 | void lambda::main() | void lambda::main() |
| destructors.cpp:51:36:51:38 | IndirectMayWriteSideEffect: call to C | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | destructors.cpp:49:7:49:7 | int cond_destruct::f(int) | int cond_destruct::f(int) |
| ir.cpp:809:7:809:13 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() |
| ir.cpp:810:7:810:26 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() |
| ir.cpp:823:7:823:13 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() |
| ir.cpp:824:7:824:26 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() |
| misc.c:125:5:125:11 | CopyValue: (statement expression) | Instruction 'CopyValue' is missing an expected operand with tag 'Unary' in function '$@'. | misc.c:97:6:97:10 | void misc3() | void misc3() |
unexpectedOperand
duplicateOperand
@@ -32,7 +13,6 @@ instructionWithoutSuccessor
| condition_decls.cpp:41:22:41:23 | IndirectMayWriteSideEffect: call to BoxedInt | Instruction 'IndirectMayWriteSideEffect: call to BoxedInt' has no successors in function '$@'. | condition_decls.cpp:40:6:40:20 | void while_decl_bind(int) | void while_decl_bind(int) |
| condition_decls.cpp:48:52:48:53 | IndirectMayWriteSideEffect: call to BoxedInt | Instruction 'IndirectMayWriteSideEffect: call to BoxedInt' has no successors in function '$@'. | condition_decls.cpp:47:6:47:18 | void for_decl_bind(int) | void for_decl_bind(int) |
| misc.c:171:10:171:13 | Uninitialized: definition of str2 | Instruction 'Uninitialized: definition of str2' has no successors in function '$@'. | misc.c:168:6:168:8 | void vla() | void vla() |
| misc.c:219:47:219:48 | InitializeIndirection: sp | Instruction 'InitializeIndirection: sp' has no successors in function '$@'. | misc.c:219:5:219:26 | int assign_designated_init(someStruct*) | int assign_designated_init(someStruct*) |
| ms_try_except.cpp:3:9:3:9 | Uninitialized: definition of x | Instruction 'Uninitialized: definition of x' has no successors in function '$@'. | ms_try_except.cpp:2:6:2:18 | void ms_try_except(int) | void ms_try_except(int) |
| ms_try_mix.cpp:11:12:11:15 | IndirectMayWriteSideEffect: call to C | Instruction 'IndirectMayWriteSideEffect: call to C' has no successors in function '$@'. | ms_try_mix.cpp:10:6:10:18 | void ms_except_mix(int) | void ms_except_mix(int) |
| ms_try_mix.cpp:28:12:28:15 | IndirectMayWriteSideEffect: call to C | Instruction 'IndirectMayWriteSideEffect: call to C' has no successors in function '$@'. | ms_try_mix.cpp:27:6:27:19 | void ms_finally_mix(int) | void ms_finally_mix(int) |
@@ -113,6 +93,11 @@ notMarkedAsConflated
wronglyMarkedAsConflated
invalidOverlap
nonUniqueEnclosingIRFunction
fieldAddressOnNonPointer
thisArgumentIsNonPointer
| pmcallexpr.cpp:8:2:8:15 | Call: call to expression | Call instruction 'Call: call to expression' has a `this` argument operand that is not an address, in function '$@'. | array_delete.cpp:5:6:5:6 | void f() | void f() |
| pointer_to_member.cpp:23:5:23:54 | Call: call to expression | Call instruction 'Call: call to expression' has a `this` argument operand that is not an address, in function '$@'. | pointer_to_member.cpp:14:5:14:9 | int usePM(int PM::*) | int usePM(int PM::*) |
| pointer_to_member.cpp:24:5:24:49 | Call: call to expression | Call instruction 'Call: call to expression' has a `this` argument operand that is not an address, in function '$@'. | pointer_to_member.cpp:14:5:14:9 | int usePM(int PM::*) | int usePM(int PM::*) |
missingCanonicalLanguageType
multipleCanonicalLanguageTypes
missingIRType

View File

@@ -10,6 +10,7 @@
| test.cpp:13:15:13:15 | constructor init of field d | struct D | struct D |
| test.cpp:19:30:19:30 | (reference to) | reference to {const {struct E}} | reference to {struct E} |
| test.cpp:19:30:19:30 | call to E | void | void |
| test.cpp:19:30:19:30 | temporary object | const {struct E} | struct E |
| test.cpp:19:30:19:30 | w | pointer to {int} | pointer to {int} |
| test.cpp:23:12:23:12 | (const F *)... | pointer to {const {struct F}} | pointer to {struct F} |
| test.cpp:23:12:23:12 | f | pointer to {struct F} | pointer to {struct F} |

View File

@@ -1,149 +1,149 @@
| Base::Base | false | 215 | 215 | Base |
| Base::Base | false | 220 | 220 | return ... |
| Base::Base | false | 222 | 222 | { ... } |
| Base::Base | false | 363 | 363 | Base |
| Base::Base | false | 367 | 367 | Base |
| Base::Base | true | 220 | 215 | |
| Base::Base | true | 222 | 220 | |
| Base::Base_f | false | 407 | 407 | Base_f |
| Base::Base_f | false | 412 | 412 | declaration |
| Base::Base_f | false | 416 | 416 | 1 |
| Base::Base_f | false | 417 | 417 | return ... |
| Base::Base_f | false | 419 | 419 | { ... } |
| Base::Base_f | false | 424 | 424 | call to f |
| Base::Base_f | false | 426 | 426 | this |
| Base::Base_f | false | 427 | 427 | initializer for i |
| Base::Base_f | true | 412 | 427 | |
| Base::Base_f | true | 416 | 407 | |
| Base::Base_f | true | 417 | 416 | |
| Base::Base_f | true | 419 | 412 | |
| Base::Base_f | true | 426 | 424 | |
| Base::Base_f | true | 427 | 426 | |
| Base::Base_g | false | 371 | 371 | Base_g |
| Base::Base_g | false | 376 | 376 | declaration |
| Base::Base_g | false | 380 | 380 | 4 |
| Base::Base_g | false | 381 | 381 | return ... |
| Base::Base_g | false | 383 | 383 | { ... } |
| Base::Base_g | false | 388 | 388 | call to g |
| Base::Base_g | false | 391 | 391 | this |
| Base::Base_g | false | 392 | 392 | initializer for i |
| Base::Base_g | true | 376 | 392 | |
| Base::Base_g | true | 380 | 371 | |
| Base::Base_g | true | 381 | 380 | |
| Base::Base_g | true | 383 | 376 | |
| Base::Base_g | true | 388 | 381 | |
| Base::Base_g | true | 391 | 388 | |
| Base::Base_g | true | 392 | 391 | |
| Base::f | false | 301 | 301 | f |
| Base::f | false | 437 | 437 | call to abort |
| Base::f | false | 439 | 439 | ExprStmt |
| Base::f | false | 441 | 441 | return ... |
| Base::f | false | 443 | 443 | { ... } |
| Base::f | true | 439 | 437 | |
| Base::f | true | 441 | 301 | |
| Base::f | true | 443 | 439 | |
| Base::g | false | 230 | 230 | g |
| Base::g | false | 402 | 402 | 3 |
| Base::g | false | 403 | 403 | return ... |
| Base::g | false | 405 | 405 | { ... } |
| Base::g | true | 402 | 230 | |
| Base::g | true | 403 | 402 | |
| Base::g | true | 405 | 403 | |
| Base::operator= | false | 349 | 349 | operator= |
| Base::operator= | false | 359 | 359 | operator= |
| __va_list_tag::operator= | false | 92 | 92 | operator= |
| __va_list_tag::operator= | false | 99 | 99 | operator= |
| abort | false | 345 | 345 | abort |
| fun_f1 | false | 312 | 312 | fun_f1 |
| fun_f1 | false | 317 | 317 | declaration |
| fun_f1 | false | 319 | 319 | declaration |
| fun_f1 | false | 323 | 323 | 2 |
| fun_f1 | false | 324 | 324 | return ... |
| fun_f1 | false | 326 | 326 | { ... } |
| fun_f1 | false | 329 | 329 | call to Base |
| fun_f1 | false | 330 | 330 | new |
| fun_f1 | false | 332 | 332 | initializer for p1 |
| fun_f1 | false | 337 | 337 | call to f |
| fun_f1 | false | 339 | 339 | p1 |
| fun_f1 | false | 341 | 341 | initializer for i |
| fun_f1 | true | 317 | 332 | |
| fun_f1 | true | 319 | 341 | |
| fun_f1 | true | 323 | 312 | |
| fun_f1 | true | 324 | 323 | |
| fun_f1 | true | 326 | 317 | |
| fun_f1 | true | 329 | 330 | |
| fun_f1 | true | 330 | 319 | |
| fun_f1 | true | 332 | 329 | |
| fun_f1 | true | 337 | 324 | |
| fun_f1 | true | 339 | 337 | |
| fun_f1 | true | 341 | 339 | |
| fun_f2 | false | 276 | 276 | fun_f2 |
| fun_f2 | false | 281 | 281 | declaration |
| fun_f2 | false | 283 | 283 | declaration |
| fun_f2 | false | 287 | 287 | 2 |
| fun_f2 | false | 288 | 288 | return ... |
| fun_f2 | false | 290 | 290 | { ... } |
| fun_f2 | false | 293 | 293 | call to Base |
| fun_f2 | false | 294 | 294 | new |
| fun_f2 | false | 296 | 296 | initializer for p1 |
| fun_f2 | false | 304 | 304 | call to f |
| fun_f2 | false | 306 | 306 | p1 |
| fun_f2 | false | 308 | 308 | initializer for i |
| fun_f2 | true | 281 | 296 | |
| fun_f2 | true | 283 | 308 | |
| fun_f2 | true | 287 | 276 | |
| fun_f2 | true | 288 | 287 | |
| fun_f2 | true | 290 | 281 | |
| fun_f2 | true | 293 | 294 | |
| fun_f2 | true | 294 | 283 | |
| fun_f2 | true | 296 | 293 | |
| fun_f2 | true | 306 | 304 | |
| fun_f2 | true | 308 | 306 | |
| fun_g1 | false | 243 | 243 | fun_g1 |
| fun_g1 | false | 248 | 248 | declaration |
| fun_g1 | false | 250 | 250 | declaration |
| fun_g1 | false | 254 | 254 | 2 |
| fun_g1 | false | 255 | 255 | return ... |
| fun_g1 | false | 257 | 257 | { ... } |
| fun_g1 | false | 260 | 260 | call to Base |
| fun_g1 | false | 261 | 261 | new |
| fun_g1 | false | 263 | 263 | initializer for p1 |
| fun_g1 | false | 268 | 268 | call to g |
| fun_g1 | false | 270 | 270 | p1 |
| fun_g1 | false | 272 | 272 | initializer for i |
| fun_g1 | true | 248 | 263 | |
| fun_g1 | true | 250 | 272 | |
| fun_g1 | true | 254 | 243 | |
| fun_g1 | true | 255 | 254 | |
| fun_g1 | true | 257 | 248 | |
| fun_g1 | true | 260 | 261 | |
| fun_g1 | true | 261 | 250 | |
| fun_g1 | true | 263 | 260 | |
| fun_g1 | true | 268 | 255 | |
| fun_g1 | true | 270 | 268 | |
| fun_g1 | true | 272 | 270 | |
| fun_g2 | false | 192 | 192 | fun_g2 |
| fun_g2 | false | 197 | 197 | declaration |
| fun_g2 | false | 199 | 199 | declaration |
| fun_g2 | false | 203 | 203 | 2 |
| fun_g2 | false | 204 | 204 | return ... |
| fun_g2 | false | 206 | 206 | { ... } |
| fun_g2 | false | 214 | 214 | call to Base |
| fun_g2 | false | 223 | 223 | new |
| fun_g2 | false | 225 | 225 | initializer for p1 |
| fun_g2 | false | 235 | 235 | call to g |
| fun_g2 | false | 237 | 237 | p1 |
| fun_g2 | false | 239 | 239 | initializer for i |
| fun_g2 | true | 197 | 225 | |
| fun_g2 | true | 199 | 239 | |
| fun_g2 | true | 203 | 192 | |
| fun_g2 | true | 204 | 203 | |
| fun_g2 | true | 206 | 197 | |
| fun_g2 | true | 214 | 223 | |
| fun_g2 | true | 223 | 199 | |
| fun_g2 | true | 225 | 214 | |
| fun_g2 | true | 235 | 204 | |
| fun_g2 | true | 237 | 235 | |
| fun_g2 | true | 239 | 237 | |
| operator delete | false | 212 | 212 | operator delete |
| operator new | false | 210 | 210 | operator new |
| Base::Base | false | 166 | 166 | Base |
| Base::Base | false | 171 | 171 | return ... |
| Base::Base | false | 173 | 173 | { ... } |
| Base::Base | false | 322 | 322 | Base |
| Base::Base | false | 326 | 326 | Base |
| Base::Base | true | 171 | 166 | |
| Base::Base | true | 173 | 171 | |
| Base::Base_f | false | 365 | 365 | Base_f |
| Base::Base_f | false | 370 | 370 | declaration |
| Base::Base_f | false | 375 | 375 | call to f |
| Base::Base_f | false | 377 | 377 | this |
| Base::Base_f | false | 378 | 378 | initializer for i |
| Base::Base_f | false | 382 | 382 | return ... |
| Base::Base_f | false | 386 | 386 | 1 |
| Base::Base_f | false | 387 | 387 | { ... } |
| Base::Base_f | true | 370 | 378 | |
| Base::Base_f | true | 377 | 375 | |
| Base::Base_f | true | 378 | 377 | |
| Base::Base_f | true | 382 | 386 | |
| Base::Base_f | true | 386 | 365 | |
| Base::Base_f | true | 387 | 370 | |
| Base::Base_g | false | 330 | 330 | Base_g |
| Base::Base_g | false | 335 | 335 | declaration |
| Base::Base_g | false | 340 | 340 | call to g |
| Base::Base_g | false | 342 | 342 | this |
| Base::Base_g | false | 343 | 343 | initializer for i |
| Base::Base_g | false | 347 | 347 | return ... |
| Base::Base_g | false | 351 | 351 | 4 |
| Base::Base_g | false | 352 | 352 | { ... } |
| Base::Base_g | true | 335 | 343 | |
| Base::Base_g | true | 340 | 347 | |
| Base::Base_g | true | 342 | 340 | |
| Base::Base_g | true | 343 | 342 | |
| Base::Base_g | true | 347 | 351 | |
| Base::Base_g | true | 351 | 330 | |
| Base::Base_g | true | 352 | 335 | |
| Base::f | false | 253 | 253 | f |
| Base::f | false | 393 | 393 | ExprStmt |
| Base::f | false | 397 | 397 | call to abort |
| Base::f | false | 399 | 399 | return ... |
| Base::f | false | 401 | 401 | { ... } |
| Base::f | true | 393 | 397 | |
| Base::f | true | 399 | 253 | |
| Base::f | true | 401 | 393 | |
| Base::g | false | 182 | 182 | g |
| Base::g | false | 358 | 358 | return ... |
| Base::g | false | 362 | 362 | 3 |
| Base::g | false | 363 | 363 | { ... } |
| Base::g | true | 358 | 362 | |
| Base::g | true | 362 | 182 | |
| Base::g | true | 363 | 358 | |
| Base::operator= | false | 307 | 307 | operator= |
| Base::operator= | false | 316 | 316 | operator= |
| __va_list_tag::operator= | false | 57 | 57 | operator= |
| __va_list_tag::operator= | false | 63 | 63 | operator= |
| abort | false | 304 | 304 | abort |
| fun_f1 | false | 271 | 271 | fun_f1 |
| fun_f1 | false | 276 | 276 | declaration |
| fun_f1 | false | 279 | 279 | call to Base |
| fun_f1 | false | 281 | 281 | new |
| fun_f1 | false | 282 | 282 | initializer for p1 |
| fun_f1 | false | 286 | 286 | declaration |
| fun_f1 | false | 289 | 289 | call to f |
| fun_f1 | false | 291 | 291 | p1 |
| fun_f1 | false | 293 | 293 | initializer for i |
| fun_f1 | false | 297 | 297 | return ... |
| fun_f1 | false | 301 | 301 | 2 |
| fun_f1 | false | 302 | 302 | { ... } |
| fun_f1 | true | 276 | 282 | |
| fun_f1 | true | 279 | 281 | |
| fun_f1 | true | 281 | 286 | |
| fun_f1 | true | 282 | 279 | |
| fun_f1 | true | 286 | 293 | |
| fun_f1 | true | 289 | 297 | |
| fun_f1 | true | 291 | 289 | |
| fun_f1 | true | 293 | 291 | |
| fun_f1 | true | 297 | 301 | |
| fun_f1 | true | 301 | 271 | |
| fun_f1 | true | 302 | 276 | |
| fun_f2 | false | 235 | 235 | fun_f2 |
| fun_f2 | false | 240 | 240 | declaration |
| fun_f2 | false | 243 | 243 | call to Base |
| fun_f2 | false | 245 | 245 | new |
| fun_f2 | false | 246 | 246 | initializer for p1 |
| fun_f2 | false | 250 | 250 | declaration |
| fun_f2 | false | 256 | 256 | call to f |
| fun_f2 | false | 258 | 258 | p1 |
| fun_f2 | false | 260 | 260 | initializer for i |
| fun_f2 | false | 264 | 264 | return ... |
| fun_f2 | false | 268 | 268 | 2 |
| fun_f2 | false | 269 | 269 | { ... } |
| fun_f2 | true | 240 | 246 | |
| fun_f2 | true | 243 | 245 | |
| fun_f2 | true | 245 | 250 | |
| fun_f2 | true | 246 | 243 | |
| fun_f2 | true | 250 | 260 | |
| fun_f2 | true | 258 | 256 | |
| fun_f2 | true | 260 | 258 | |
| fun_f2 | true | 264 | 268 | |
| fun_f2 | true | 268 | 235 | |
| fun_f2 | true | 269 | 240 | |
| fun_g1 | false | 202 | 202 | fun_g1 |
| fun_g1 | false | 207 | 207 | declaration |
| fun_g1 | false | 210 | 210 | call to Base |
| fun_g1 | false | 212 | 212 | new |
| fun_g1 | false | 213 | 213 | initializer for p1 |
| fun_g1 | false | 217 | 217 | declaration |
| fun_g1 | false | 220 | 220 | call to g |
| fun_g1 | false | 222 | 222 | p1 |
| fun_g1 | false | 224 | 224 | initializer for i |
| fun_g1 | false | 228 | 228 | return ... |
| fun_g1 | false | 232 | 232 | 2 |
| fun_g1 | false | 233 | 233 | { ... } |
| fun_g1 | true | 207 | 213 | |
| fun_g1 | true | 210 | 212 | |
| fun_g1 | true | 212 | 217 | |
| fun_g1 | true | 213 | 210 | |
| fun_g1 | true | 217 | 224 | |
| fun_g1 | true | 220 | 228 | |
| fun_g1 | true | 222 | 220 | |
| fun_g1 | true | 224 | 222 | |
| fun_g1 | true | 228 | 232 | |
| fun_g1 | true | 232 | 202 | |
| fun_g1 | true | 233 | 207 | |
| fun_g2 | false | 151 | 151 | fun_g2 |
| fun_g2 | false | 156 | 156 | declaration |
| fun_g2 | false | 164 | 164 | call to Base |
| fun_g2 | false | 174 | 174 | new |
| fun_g2 | false | 175 | 175 | initializer for p1 |
| fun_g2 | false | 179 | 179 | declaration |
| fun_g2 | false | 187 | 187 | call to g |
| fun_g2 | false | 189 | 189 | p1 |
| fun_g2 | false | 191 | 191 | initializer for i |
| fun_g2 | false | 195 | 195 | return ... |
| fun_g2 | false | 199 | 199 | 2 |
| fun_g2 | false | 200 | 200 | { ... } |
| fun_g2 | true | 156 | 175 | |
| fun_g2 | true | 164 | 174 | |
| fun_g2 | true | 174 | 179 | |
| fun_g2 | true | 175 | 164 | |
| fun_g2 | true | 179 | 191 | |
| fun_g2 | true | 187 | 195 | |
| fun_g2 | true | 189 | 187 | |
| fun_g2 | true | 191 | 189 | |
| fun_g2 | true | 195 | 199 | |
| fun_g2 | true | 199 | 151 | |
| fun_g2 | true | 200 | 156 | |
| operator delete | false | 162 | 162 | operator delete |
| operator new | false | 160 | 160 | operator new |

View File

@@ -1,20 +1,30 @@
edges
| search.c:14:24:14:28 | *query | search.c:17:8:17:12 | (const char *)... |
| search.c:14:24:14:28 | *query | search.c:17:8:17:12 | query |
| search.c:14:24:14:28 | query | search.c:17:8:17:12 | (const char *)... |
| search.c:14:24:14:28 | query | search.c:17:8:17:12 | query |
| search.c:14:24:14:28 | query | search.c:17:8:17:12 | query |
| search.c:22:24:22:28 | *query | search.c:23:39:23:43 | query |
| search.c:22:24:22:28 | *query | search.c:23:39:23:43 | query |
| search.c:22:24:22:28 | query | search.c:23:39:23:43 | query |
| search.c:22:24:22:28 | query | search.c:23:39:23:43 | query |
| search.c:41:21:41:26 | call to getenv | search.c:14:24:14:28 | *query |
| search.c:41:21:41:26 | call to getenv | search.c:14:24:14:28 | *query |
| search.c:41:21:41:26 | call to getenv | search.c:14:24:14:28 | query |
| search.c:41:21:41:26 | call to getenv | search.c:14:24:14:28 | query |
| search.c:41:21:41:26 | call to getenv | search.c:22:24:22:28 | *query |
| search.c:41:21:41:26 | call to getenv | search.c:22:24:22:28 | *query |
| search.c:41:21:41:26 | call to getenv | search.c:22:24:22:28 | query |
| search.c:41:21:41:26 | call to getenv | search.c:22:24:22:28 | query |
nodes
| search.c:14:24:14:28 | *query | semmle.label | *query |
| search.c:14:24:14:28 | query | semmle.label | query |
| search.c:17:8:17:12 | (const char *)... | semmle.label | (const char *)... |
| search.c:17:8:17:12 | (const char *)... | semmle.label | (const char *)... |
| search.c:17:8:17:12 | query | semmle.label | query |
| search.c:17:8:17:12 | query | semmle.label | query |
| search.c:17:8:17:12 | query | semmle.label | query |
| search.c:22:24:22:28 | *query | semmle.label | *query |
| search.c:22:24:22:28 | query | semmle.label | query |
| search.c:23:39:23:43 | query | semmle.label | query |
| search.c:23:39:23:43 | query | semmle.label | query |
@@ -22,7 +32,9 @@ nodes
| search.c:41:21:41:26 | call to getenv | semmle.label | call to getenv |
| search.c:41:21:41:26 | call to getenv | semmle.label | call to getenv |
| search.c:45:5:45:15 | Argument 0 | semmle.label | Argument 0 |
| search.c:45:17:45:25 | Argument 0 indirection | semmle.label | Argument 0 indirection |
| search.c:47:5:47:15 | Argument 0 | semmle.label | Argument 0 |
| search.c:47:17:47:25 | Argument 0 indirection | semmle.label | Argument 0 indirection |
#select
| search.c:17:8:17:12 | query | search.c:41:21:41:26 | call to getenv | search.c:17:8:17:12 | query | Cross-site scripting vulnerability due to $@. | search.c:41:21:41:26 | call to getenv | this query data |
| search.c:23:39:23:43 | query | search.c:41:21:41:26 | call to getenv | search.c:23:39:23:43 | query | Cross-site scripting vulnerability due to $@. | search.c:41:21:41:26 | call to getenv | this query data |

View File

@@ -1,11 +1,19 @@
edges
| test.cpp:24:30:24:36 | *command | test.cpp:26:10:26:16 | command |
| test.cpp:24:30:24:36 | *command | test.cpp:26:10:26:16 | command |
| test.cpp:24:30:24:36 | command | test.cpp:26:10:26:16 | command |
| test.cpp:24:30:24:36 | command | test.cpp:26:10:26:16 | command |
| test.cpp:29:30:29:36 | *command | test.cpp:31:10:31:16 | command |
| test.cpp:29:30:29:36 | *command | test.cpp:31:10:31:16 | command |
| test.cpp:29:30:29:36 | command | test.cpp:31:10:31:16 | command |
| test.cpp:29:30:29:36 | command | test.cpp:31:10:31:16 | command |
| test.cpp:42:18:42:23 | call to getenv | test.cpp:24:30:24:36 | *command |
| test.cpp:42:18:42:23 | call to getenv | test.cpp:24:30:24:36 | command |
| test.cpp:42:18:42:34 | (const char *)... | test.cpp:24:30:24:36 | *command |
| test.cpp:42:18:42:34 | (const char *)... | test.cpp:24:30:24:36 | command |
| test.cpp:43:18:43:23 | call to getenv | test.cpp:29:30:29:36 | *command |
| test.cpp:43:18:43:23 | call to getenv | test.cpp:29:30:29:36 | command |
| test.cpp:43:18:43:34 | (const char *)... | test.cpp:29:30:29:36 | *command |
| test.cpp:43:18:43:34 | (const char *)... | test.cpp:29:30:29:36 | command |
| test.cpp:56:12:56:17 | buffer | test.cpp:62:10:62:15 | (const char *)... |
| test.cpp:56:12:56:17 | buffer | test.cpp:62:10:62:15 | buffer |
@@ -24,10 +32,12 @@ edges
| test.cpp:76:12:76:17 | fgets output argument | test.cpp:79:10:79:13 | (const char *)... |
| test.cpp:76:12:76:17 | fgets output argument | test.cpp:79:10:79:13 | data |
nodes
| test.cpp:24:30:24:36 | *command | semmle.label | *command |
| test.cpp:24:30:24:36 | command | semmle.label | command |
| test.cpp:26:10:26:16 | command | semmle.label | command |
| test.cpp:26:10:26:16 | command | semmle.label | command |
| test.cpp:26:10:26:16 | command | semmle.label | command |
| test.cpp:29:30:29:36 | *command | semmle.label | *command |
| test.cpp:29:30:29:36 | command | semmle.label | command |
| test.cpp:31:10:31:16 | command | semmle.label | command |
| test.cpp:31:10:31:16 | command | semmle.label | command |
@@ -35,9 +45,11 @@ nodes
| test.cpp:42:7:42:16 | Argument 0 | semmle.label | Argument 0 |
| test.cpp:42:18:42:23 | call to getenv | semmle.label | call to getenv |
| test.cpp:42:18:42:34 | (const char *)... | semmle.label | (const char *)... |
| test.cpp:42:18:42:34 | Argument 0 indirection | semmle.label | Argument 0 indirection |
| test.cpp:43:7:43:16 | Argument 0 | semmle.label | Argument 0 |
| test.cpp:43:18:43:23 | call to getenv | semmle.label | call to getenv |
| test.cpp:43:18:43:34 | (const char *)... | semmle.label | (const char *)... |
| test.cpp:43:18:43:34 | Argument 0 indirection | semmle.label | Argument 0 indirection |
| test.cpp:56:12:56:17 | buffer | semmle.label | buffer |
| test.cpp:56:12:56:17 | fgets output argument | semmle.label | fgets output argument |
| test.cpp:62:10:62:15 | (const char *)... | semmle.label | (const char *)... |

View File

@@ -19,6 +19,8 @@ edges
| globalVars.c:12:2:12:15 | Store | globalVars.c:8:7:8:10 | copy |
| globalVars.c:15:21:15:23 | val | globalVars.c:16:2:16:12 | Store |
| globalVars.c:16:2:16:12 | Store | globalVars.c:9:7:9:11 | copy2 |
| globalVars.c:24:11:24:14 | argv | globalVars.c:11:22:11:25 | *argv |
| globalVars.c:24:11:24:14 | argv | globalVars.c:11:22:11:25 | *argv |
| globalVars.c:24:11:24:14 | argv | globalVars.c:11:22:11:25 | argv |
| globalVars.c:24:11:24:14 | argv | globalVars.c:11:22:11:25 | argv |
| globalVars.c:27:9:27:12 | copy | globalVars.c:27:9:27:12 | (const char *)... |
@@ -37,6 +39,7 @@ nodes
| globalVars.c:15:21:15:23 | val | semmle.label | val |
| globalVars.c:16:2:16:12 | Store | semmle.label | Store |
| globalVars.c:24:2:24:9 | Argument 0 | semmle.label | Argument 0 |
| globalVars.c:24:11:24:14 | Argument 0 indirection | semmle.label | Argument 0 indirection |
| globalVars.c:24:11:24:14 | argv | semmle.label | argv |
| globalVars.c:24:11:24:14 | argv | semmle.label | argv |
| globalVars.c:27:9:27:12 | (const char *)... | semmle.label | (const char *)... |

View File

@@ -1,167 +1,175 @@
| C1::C1 | false | 254 | 254 | C1 |
| C1::C1 | false | 420 | 420 | C1 |
| C1::C1 | false | 424 | 424 | C1 |
| C1::C1 | false | 470 | 470 | this |
| C1::C1 | false | 472 | 472 | val |
| C1::C1 | false | 475 | 475 | x |
| C1::C1 | false | 478 | 478 | ... = ... |
| C1::C1 | false | 481 | 481 | ExprStmt |
| C1::C1 | false | 484 | 484 | return ... |
| C1::C1 | false | 487 | 487 | { ... } |
| C1::C1 | true | 470 | 472 | |
| C1::C1 | true | 472 | 478 | |
| C1::C1 | true | 475 | 470 | |
| C1::C1 | true | 478 | 484 | |
| C1::C1 | true | 481 | 475 | |
| C1::C1 | true | 484 | 254 | |
| C1::C1 | true | 487 | 481 | |
| C1::operator= | false | 409 | 409 | operator= |
| C1::operator= | false | 416 | 416 | operator= |
| C1::operator== | false | 241 | 241 | operator== |
| C1::operator== | false | 439 | 439 | this |
| C1::operator== | false | 442 | 442 | val |
| C1::operator== | false | 445 | 445 | other |
| C1::operator== | false | 448 | 448 | (reference dereference) |
| C1::operator== | false | 450 | 450 | val |
| C1::operator== | false | 453 | 453 | ... == ... |
| C1::operator== | false | 456 | 456 | return ... |
| C1::operator== | false | 459 | 459 | { ... } |
| C1::operator== | true | 439 | 442 | |
| C1::operator== | true | 442 | 445 | |
| C1::operator== | true | 445 | 450 | |
| C1::operator== | true | 450 | 453 | |
| C1::operator== | true | 453 | 241 | |
| C1::operator== | true | 456 | 439 | |
| C1::operator== | true | 459 | 456 | |
| C2::C2 | false | 163 | 163 | C2 |
| C2::C2 | false | 329 | 329 | C2 |
| C2::C2 | false | 389 | 389 | this |
| C2::C2 | false | 391 | 391 | val |
| C2::C2 | false | 394 | 394 | x |
| C2::C2 | false | 397 | 397 | ... = ... |
| C2::C2 | false | 400 | 400 | ExprStmt |
| C2::C2 | false | 403 | 403 | return ... |
| C2::C2 | false | 406 | 406 | { ... } |
| C2::C2 | true | 389 | 391 | |
| C2::C2 | true | 391 | 397 | |
| C2::C2 | true | 394 | 389 | |
| C2::C2 | true | 397 | 403 | |
| C2::C2 | true | 400 | 394 | |
| C2::C2 | true | 403 | 163 | |
| C2::C2 | true | 406 | 400 | |
| C2::operator= | false | 323 | 323 | operator= |
| C2::operator== | false | 150 | 150 | operator== |
| C2::operator== | false | 344 | 344 | this |
| C2::operator== | false | 347 | 347 | val |
| C2::operator== | false | 350 | 350 | other |
| C2::operator== | false | 353 | 353 | (reference dereference) |
| C2::operator== | false | 355 | 355 | val |
| C2::operator== | false | 358 | 358 | ... == ... |
| C2::operator== | false | 361 | 361 | return ... |
| C2::operator== | false | 364 | 364 | { ... } |
| C2::operator== | true | 344 | 347 | |
| C2::operator== | true | 347 | 350 | |
| C2::operator== | true | 350 | 355 | |
| C2::operator== | true | 355 | 358 | |
| C2::operator== | true | 358 | 150 | |
| C2::operator== | true | 361 | 344 | |
| C2::operator== | true | 364 | 361 | |
| C2::~C2 | false | 366 | 366 | ~C2 |
| C2::~C2 | false | 372 | 372 | ; |
| C2::~C2 | false | 375 | 375 | return ... |
| C2::~C2 | false | 378 | 378 | { ... } |
| C2::~C2 | true | 372 | 375 | |
| C2::~C2 | true | 375 | 366 | |
| C2::~C2 | true | 378 | 372 | |
| __va_list_tag::operator= | false | 64 | 64 | operator= |
| __va_list_tag::operator= | false | 70 | 70 | operator= |
| f1 | false | 232 | 232 | f1 |
| f1 | false | 250 | 250 | call to operator== |
| f1 | false | 252 | 252 | call to C1 |
| f1 | false | 259 | 259 | 1 |
| f1 | false | 261 | 261 | (const C1)... |
| f1 | false | 263 | 263 | call to C1 |
| f1 | false | 269 | 269 | 2 |
| f1 | false | 271 | 271 | (const C1)... |
| C1::C1 | false | 237 | 237 | C1 |
| C1::C1 | false | 359 | 359 | C1 |
| C1::C1 | false | 363 | 363 | C1 |
| C1::C1 | false | 398 | 398 | ExprStmt |
| C1::C1 | false | 400 | 400 | this |
| C1::C1 | false | 401 | 401 | val |
| C1::C1 | false | 403 | 403 | x |
| C1::C1 | false | 405 | 405 | ... = ... |
| C1::C1 | false | 407 | 407 | return ... |
| C1::C1 | false | 409 | 409 | { ... } |
| C1::C1 | true | 398 | 403 | |
| C1::C1 | true | 400 | 401 | |
| C1::C1 | true | 401 | 405 | |
| C1::C1 | true | 403 | 400 | |
| C1::C1 | true | 405 | 407 | |
| C1::C1 | true | 407 | 237 | |
| C1::C1 | true | 409 | 398 | |
| C1::operator= | false | 348 | 348 | operator= |
| C1::operator= | false | 355 | 355 | operator= |
| C1::operator== | false | 226 | 226 | operator== |
| C1::operator== | false | 376 | 376 | return ... |
| C1::operator== | false | 378 | 378 | this |
| C1::operator== | false | 379 | 379 | val |
| C1::operator== | false | 382 | 382 | other |
| C1::operator== | false | 384 | 384 | (reference dereference) |
| C1::operator== | false | 385 | 385 | val |
| C1::operator== | false | 387 | 387 | ... == ... |
| C1::operator== | false | 389 | 389 | { ... } |
| C1::operator== | true | 376 | 378 | |
| C1::operator== | true | 378 | 379 | |
| C1::operator== | true | 379 | 382 | |
| C1::operator== | true | 382 | 385 | |
| C1::operator== | true | 385 | 387 | |
| C1::operator== | true | 387 | 226 | |
| C1::operator== | true | 389 | 376 | |
| C2::C2 | false | 170 | 170 | C2 |
| C2::C2 | false | 288 | 288 | C2 |
| C2::C2 | false | 334 | 334 | ExprStmt |
| C2::C2 | false | 336 | 336 | this |
| C2::C2 | false | 337 | 337 | val |
| C2::C2 | false | 339 | 339 | x |
| C2::C2 | false | 341 | 341 | ... = ... |
| C2::C2 | false | 343 | 343 | return ... |
| C2::C2 | false | 345 | 345 | { ... } |
| C2::C2 | true | 334 | 339 | |
| C2::C2 | true | 336 | 337 | |
| C2::C2 | true | 337 | 341 | |
| C2::C2 | true | 339 | 336 | |
| C2::C2 | true | 341 | 343 | |
| C2::C2 | true | 343 | 170 | |
| C2::C2 | true | 345 | 334 | |
| C2::operator= | false | 282 | 282 | operator= |
| C2::operator== | false | 159 | 159 | operator== |
| C2::operator== | false | 301 | 301 | return ... |
| C2::operator== | false | 303 | 303 | this |
| C2::operator== | false | 304 | 304 | val |
| C2::operator== | false | 307 | 307 | other |
| C2::operator== | false | 309 | 309 | (reference dereference) |
| C2::operator== | false | 310 | 310 | val |
| C2::operator== | false | 312 | 312 | ... == ... |
| C2::operator== | false | 314 | 314 | { ... } |
| C2::operator== | true | 301 | 303 | |
| C2::operator== | true | 303 | 304 | |
| C2::operator== | true | 304 | 307 | |
| C2::operator== | true | 307 | 310 | |
| C2::operator== | true | 310 | 312 | |
| C2::operator== | true | 312 | 159 | |
| C2::operator== | true | 314 | 301 | |
| C2::~C2 | false | 316 | 316 | ~C2 |
| C2::~C2 | false | 321 | 321 | ; |
| C2::~C2 | false | 323 | 323 | return ... |
| C2::~C2 | false | 325 | 325 | { ... } |
| C2::~C2 | true | 321 | 323 | |
| C2::~C2 | true | 323 | 316 | |
| C2::~C2 | true | 325 | 321 | |
| __va_list_tag::operator= | false | 57 | 57 | operator= |
| __va_list_tag::operator= | false | 63 | 63 | operator= |
| f1 | false | 215 | 215 | f1 |
| f1 | false | 220 | 220 | if (...) ... |
| f1 | false | 234 | 234 | call to operator== |
| f1 | false | 235 | 235 | call to C1 |
| f1 | false | 240 | 240 | 1 |
| f1 | false | 241 | 241 | temporary object |
| f1 | false | 242 | 242 | (const C1)... |
| f1 | false | 243 | 243 | call to C1 |
| f1 | false | 247 | 247 | 2 |
| f1 | false | 248 | 248 | temporary object |
| f1 | false | 249 | 249 | (const C1)... |
| f1 | false | 250 | 250 | (reference to) |
| f1 | false | 251 | 251 | ; |
| f1 | false | 253 | 253 | { ... } |
| f1 | false | 255 | 255 | if (...) ... |
| f1 | false | 258 | 258 | call to operator== |
| f1 | false | 259 | 259 | call to C1 |
| f1 | false | 263 | 263 | 3 |
| f1 | false | 264 | 264 | temporary object |
| f1 | false | 265 | 265 | (const C1)... |
| f1 | false | 266 | 266 | call to C1 |
| f1 | false | 270 | 270 | 3 |
| f1 | false | 271 | 271 | temporary object |
| f1 | false | 272 | 272 | (const C1)... |
| f1 | false | 273 | 273 | (reference to) |
| f1 | false | 275 | 275 | ; |
| f1 | false | 278 | 278 | { ... } |
| f1 | false | 281 | 281 | if (...) ... |
| f1 | false | 285 | 285 | call to operator== |
| f1 | false | 287 | 287 | call to C1 |
| f1 | false | 293 | 293 | 3 |
| f1 | false | 295 | 295 | (const C1)... |
| f1 | false | 297 | 297 | call to C1 |
| f1 | false | 303 | 303 | 3 |
| f1 | false | 305 | 305 | (const C1)... |
| f1 | false | 307 | 307 | (reference to) |
| f1 | false | 309 | 309 | ; |
| f1 | false | 312 | 312 | { ... } |
| f1 | false | 315 | 315 | if (...) ... |
| f1 | false | 318 | 318 | return ... |
| f1 | false | 321 | 321 | { ... } |
| f1 | true | 250 | 278 | T |
| f1 | true | 250 | 315 | F |
| f1 | true | 252 | 250 | |
| f1 | true | 259 | 252 | |
| f1 | false | 274 | 274 | ; |
| f1 | false | 276 | 276 | { ... } |
| f1 | false | 278 | 278 | return ... |
| f1 | false | 280 | 280 | { ... } |
| f1 | true | 220 | 247 | |
| f1 | true | 234 | 253 | T |
| f1 | true | 234 | 255 | F |
| f1 | true | 235 | 234 | |
| f1 | true | 240 | 235 | |
| f1 | true | 243 | 240 | |
| f1 | true | 247 | 243 | |
| f1 | true | 251 | 255 | |
| f1 | true | 253 | 251 | |
| f1 | true | 255 | 270 | |
| f1 | true | 258 | 276 | T |
| f1 | true | 258 | 278 | F |
| f1 | true | 259 | 258 | |
| f1 | true | 263 | 259 | |
| f1 | true | 269 | 263 | |
| f1 | true | 275 | 315 | |
| f1 | true | 278 | 275 | |
| f1 | true | 281 | 269 | |
| f1 | true | 285 | 312 | T |
| f1 | true | 285 | 318 | F |
| f1 | true | 287 | 285 | |
| f1 | true | 293 | 287 | |
| f1 | true | 297 | 293 | |
| f1 | true | 303 | 297 | |
| f1 | true | 309 | 318 | |
| f1 | true | 312 | 309 | |
| f1 | true | 315 | 303 | |
| f1 | true | 318 | 232 | |
| f1 | true | 321 | 281 | |
| f2 | false | 141 | 141 | f2 |
| f2 | false | 159 | 159 | call to operator== |
| f2 | false | 161 | 161 | call to C2 |
| f2 | false | 168 | 168 | 1 |
| f2 | false | 170 | 170 | (const C2)... |
| f2 | false | 172 | 172 | call to C2 |
| f2 | false | 178 | 178 | 2 |
| f2 | false | 180 | 180 | (const C2)... |
| f2 | false | 182 | 182 | (reference to) |
| f1 | true | 266 | 263 | |
| f1 | true | 270 | 266 | |
| f1 | true | 274 | 278 | |
| f1 | true | 276 | 274 | |
| f1 | true | 278 | 215 | |
| f1 | true | 280 | 220 | |
| f2 | false | 148 | 148 | f2 |
| f2 | false | 153 | 153 | if (...) ... |
| f2 | false | 167 | 167 | call to operator== |
| f2 | false | 168 | 168 | call to C2 |
| f2 | false | 173 | 173 | 1 |
| f2 | false | 174 | 174 | temporary object |
| f2 | false | 175 | 175 | (const C2)... |
| f2 | false | 176 | 176 | call to C2 |
| f2 | false | 180 | 180 | 2 |
| f2 | false | 181 | 181 | temporary object |
| f2 | false | 182 | 182 | (const C2)... |
| f2 | false | 183 | 183 | (reference to) |
| f2 | false | 184 | 184 | ; |
| f2 | false | 187 | 187 | { ... } |
| f2 | false | 190 | 190 | if (...) ... |
| f2 | false | 194 | 194 | call to operator== |
| f2 | false | 196 | 196 | call to C2 |
| f2 | false | 202 | 202 | 3 |
| f2 | false | 204 | 204 | (const C2)... |
| f2 | false | 206 | 206 | call to C2 |
| f2 | false | 212 | 212 | 3 |
| f2 | false | 214 | 214 | (const C2)... |
| f2 | false | 216 | 216 | (reference to) |
| f2 | false | 218 | 218 | ; |
| f2 | false | 221 | 221 | { ... } |
| f2 | false | 224 | 224 | if (...) ... |
| f2 | false | 227 | 227 | return ... |
| f2 | false | 230 | 230 | { ... } |
| f2 | true | 159 | 187 | T |
| f2 | true | 159 | 224 | F |
| f2 | true | 161 | 159 | |
| f2 | true | 168 | 161 | |
| f2 | true | 172 | 168 | |
| f2 | true | 178 | 172 | |
| f2 | true | 184 | 224 | |
| f2 | true | 187 | 184 | |
| f2 | true | 190 | 178 | |
| f2 | true | 194 | 221 | T |
| f2 | true | 194 | 227 | F |
| f2 | true | 196 | 194 | |
| f2 | true | 202 | 196 | |
| f2 | true | 206 | 202 | |
| f2 | true | 212 | 206 | |
| f2 | true | 218 | 227 | |
| f2 | true | 221 | 218 | |
| f2 | true | 224 | 212 | |
| f2 | true | 227 | 141 | |
| f2 | true | 230 | 190 | |
| f2 | false | 186 | 186 | { ... } |
| f2 | false | 188 | 188 | if (...) ... |
| f2 | false | 191 | 191 | call to operator== |
| f2 | false | 192 | 192 | call to C2 |
| f2 | false | 196 | 196 | 3 |
| f2 | false | 197 | 197 | temporary object |
| f2 | false | 198 | 198 | (const C2)... |
| f2 | false | 199 | 199 | call to C2 |
| f2 | false | 203 | 203 | 3 |
| f2 | false | 204 | 204 | temporary object |
| f2 | false | 205 | 205 | (const C2)... |
| f2 | false | 206 | 206 | (reference to) |
| f2 | false | 207 | 207 | ; |
| f2 | false | 209 | 209 | { ... } |
| f2 | false | 211 | 211 | return ... |
| f2 | false | 213 | 213 | { ... } |
| f2 | true | 153 | 180 | |
| f2 | true | 167 | 186 | T |
| f2 | true | 167 | 188 | F |
| f2 | true | 168 | 167 | |
| f2 | true | 173 | 168 | |
| f2 | true | 176 | 173 | |
| f2 | true | 180 | 176 | |
| f2 | true | 184 | 188 | |
| f2 | true | 186 | 184 | |
| f2 | true | 188 | 203 | |
| f2 | true | 191 | 209 | T |
| f2 | true | 191 | 211 | F |
| f2 | true | 192 | 191 | |
| f2 | true | 196 | 192 | |
| f2 | true | 199 | 196 | |
| f2 | true | 203 | 199 | |
| f2 | true | 207 | 211 | |
| f2 | true | 209 | 207 | |
| f2 | true | 211 | 148 | |
| f2 | true | 213 | 153 | |

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,2 @@
description: Add temporary object initializations
compatibility: partial

View File

@@ -494,4 +494,34 @@ module InstructionConsistency {
irFunc = getInstructionIRFunction(instr, irFuncText)
)
}
/**
* Holds if the object address operand for the given `FieldAddress` instruction does not have an
* address type.
*/
query predicate fieldAddressOnNonPointer(
FieldAddressInstruction instr, string message, OptionalIRFunction irFunc, string irFuncText
) {
not instr.getObjectAddressOperand().getIRType() instanceof IRAddressType and
message =
"FieldAddress instruction '" + instr.toString() +
"' has an object address operand that is not an address, in function '$@'." and
irFunc = getInstructionIRFunction(instr, irFuncText)
}
/**
* Holds if the `this` argument operand for the given `Call` instruction does not have an address
* type.
*/
query predicate thisArgumentIsNonPointer(
CallInstruction instr, string message, OptionalIRFunction irFunc, string irFuncText
) {
exists(ThisArgumentOperand thisOperand | thisOperand = instr.getThisArgumentOperand() |
not thisOperand.getIRType() instanceof IRAddressType
) and
message =
"Call instruction '" + instr.toString() +
"' has a `this` argument operand that is not an address, in function '$@'." and
irFunc = getInstructionIRFunction(instr, irFuncText)
}
}

View File

@@ -494,4 +494,34 @@ module InstructionConsistency {
irFunc = getInstructionIRFunction(instr, irFuncText)
)
}
/**
* Holds if the object address operand for the given `FieldAddress` instruction does not have an
* address type.
*/
query predicate fieldAddressOnNonPointer(
FieldAddressInstruction instr, string message, OptionalIRFunction irFunc, string irFuncText
) {
not instr.getObjectAddressOperand().getIRType() instanceof IRAddressType and
message =
"FieldAddress instruction '" + instr.toString() +
"' has an object address operand that is not an address, in function '$@'." and
irFunc = getInstructionIRFunction(instr, irFuncText)
}
/**
* Holds if the `this` argument operand for the given `Call` instruction does not have an address
* type.
*/
query predicate thisArgumentIsNonPointer(
CallInstruction instr, string message, OptionalIRFunction irFunc, string irFuncText
) {
exists(ThisArgumentOperand thisOperand | thisOperand = instr.getThisArgumentOperand() |
not thisOperand.getIRType() instanceof IRAddressType
) and
message =
"Call instruction '" + instr.toString() +
"' has a `this` argument operand that is not an address, in function '$@'." and
irFunc = getInstructionIRFunction(instr, irFuncText)
}
}

View File

@@ -21,6 +21,16 @@ notMarkedAsConflated
wronglyMarkedAsConflated
invalidOverlap
nonUniqueEnclosingIRFunction
fieldAddressOnNonPointer
| inoutref.cs:18:9:18:13 | FieldAddress: access to field fld | FieldAddress instruction 'FieldAddress: access to field fld' has an object address operand that is not an address, in function '$@'. | inoutref.cs:16:17:16:17 | System.Void InOutRef.F(System.Int32,MyStruct,MyStruct,MyClass,MyClass) | System.Void InOutRef.F(System.Int32,MyStruct,MyStruct,MyClass,MyClass) |
| inoutref.cs:19:13:19:17 | FieldAddress: access to field fld | FieldAddress instruction 'FieldAddress: access to field fld' has an object address operand that is not an address, in function '$@'. | inoutref.cs:16:17:16:17 | System.Void InOutRef.F(System.Int32,MyStruct,MyStruct,MyClass,MyClass) | System.Void InOutRef.F(System.Int32,MyStruct,MyStruct,MyClass,MyClass) |
| pointers.cs:35:17:35:24 | FieldAddress: access to field fld | FieldAddress instruction 'FieldAddress: access to field fld' has an object address operand that is not an address, in function '$@'. | pointers.cs:25:17:25:20 | System.Void Pointers.Main() | System.Void Pointers.Main() |
thisArgumentIsNonPointer
| foreach.cs:7:9:10:9 | Call: foreach (... ... in ...) ... | Call instruction 'Call: foreach (... ... in ...) ...' has a `this` argument operand that is not an address, in function '$@'. | foreach.cs:4:24:4:27 | System.Void ForEach.Main() | System.Void ForEach.Main() |
| foreach.cs:7:9:10:9 | Call: foreach (... ... in ...) ... | Call instruction 'Call: foreach (... ... in ...) ...' has a `this` argument operand that is not an address, in function '$@'. | foreach.cs:4:24:4:27 | System.Void ForEach.Main() | System.Void ForEach.Main() |
| foreach.cs:7:9:10:9 | Call: foreach (... ... in ...) ... | Call instruction 'Call: foreach (... ... in ...) ...' has a `this` argument operand that is not an address, in function '$@'. | foreach.cs:4:24:4:27 | System.Void ForEach.Main() | System.Void ForEach.Main() |
| inoutref.cs:32:22:32:35 | Call: object creation of type MyStruct | Call instruction 'Call: object creation of type MyStruct' has a `this` argument operand that is not an address, in function '$@'. | inoutref.cs:29:17:29:20 | System.Void InOutRef.Main() | System.Void InOutRef.Main() |
| pointers.cs:27:22:27:35 | Call: object creation of type MyStruct | Call instruction 'Call: object creation of type MyStruct' has a `this` argument operand that is not an address, in function '$@'. | pointers.cs:25:17:25:20 | System.Void Pointers.Main() | System.Void Pointers.Main() |
missingCanonicalLanguageType
multipleCanonicalLanguageTypes
missingIRType

View File

@@ -21,6 +21,16 @@ notMarkedAsConflated
wronglyMarkedAsConflated
invalidOverlap
nonUniqueEnclosingIRFunction
fieldAddressOnNonPointer
| inoutref.cs:18:9:18:13 | FieldAddress: access to field fld | FieldAddress instruction 'FieldAddress: access to field fld' has an object address operand that is not an address, in function '$@'. | inoutref.cs:16:17:16:17 | System.Void InOutRef.F(System.Int32,MyStruct,MyStruct,MyClass,MyClass) | System.Void InOutRef.F(System.Int32,MyStruct,MyStruct,MyClass,MyClass) |
| inoutref.cs:19:13:19:17 | FieldAddress: access to field fld | FieldAddress instruction 'FieldAddress: access to field fld' has an object address operand that is not an address, in function '$@'. | inoutref.cs:16:17:16:17 | System.Void InOutRef.F(System.Int32,MyStruct,MyStruct,MyClass,MyClass) | System.Void InOutRef.F(System.Int32,MyStruct,MyStruct,MyClass,MyClass) |
| pointers.cs:35:17:35:24 | FieldAddress: access to field fld | FieldAddress instruction 'FieldAddress: access to field fld' has an object address operand that is not an address, in function '$@'. | pointers.cs:25:17:25:20 | System.Void Pointers.Main() | System.Void Pointers.Main() |
thisArgumentIsNonPointer
| foreach.cs:7:9:10:9 | Call: foreach (... ... in ...) ... | Call instruction 'Call: foreach (... ... in ...) ...' has a `this` argument operand that is not an address, in function '$@'. | foreach.cs:4:24:4:27 | System.Void ForEach.Main() | System.Void ForEach.Main() |
| foreach.cs:7:9:10:9 | Call: foreach (... ... in ...) ... | Call instruction 'Call: foreach (... ... in ...) ...' has a `this` argument operand that is not an address, in function '$@'. | foreach.cs:4:24:4:27 | System.Void ForEach.Main() | System.Void ForEach.Main() |
| foreach.cs:7:9:10:9 | Call: foreach (... ... in ...) ... | Call instruction 'Call: foreach (... ... in ...) ...' has a `this` argument operand that is not an address, in function '$@'. | foreach.cs:4:24:4:27 | System.Void ForEach.Main() | System.Void ForEach.Main() |
| inoutref.cs:32:22:32:35 | Call: object creation of type MyStruct | Call instruction 'Call: object creation of type MyStruct' has a `this` argument operand that is not an address, in function '$@'. | inoutref.cs:29:17:29:20 | System.Void InOutRef.Main() | System.Void InOutRef.Main() |
| pointers.cs:27:22:27:35 | Call: object creation of type MyStruct | Call instruction 'Call: object creation of type MyStruct' has a `this` argument operand that is not an address, in function '$@'. | pointers.cs:25:17:25:20 | System.Void Pointers.Main() | System.Void Pointers.Main() |
missingCanonicalLanguageType
multipleCanonicalLanguageTypes
missingIRType