mirror of
https://github.com/github/codeql.git
synced 2025-12-16 16:53:25 +01:00
Merge pull request #9971 from jketema/attribute-arg
C++: Handle all forms of constant attribute arguments
This commit is contained in:
@@ -0,0 +1,17 @@
|
||||
class AttributeArgument extends @attribute_arg {
|
||||
string toString() { none() }
|
||||
}
|
||||
|
||||
class Attribute extends @attribute {
|
||||
string toString() { none() }
|
||||
}
|
||||
|
||||
class LocationDefault extends @location_default {
|
||||
string toString() { none() }
|
||||
}
|
||||
|
||||
from AttributeArgument arg, int kind, Attribute attr, int index, LocationDefault location
|
||||
where
|
||||
attribute_args(arg, kind, attr, index, location) and
|
||||
not arg instanceof @attribute_arg_constant_expr
|
||||
select arg, kind, attr, index, location
|
||||
2130
cpp/downgrades/34549c3b0937002f11037d01822ebe99442c1402/old.dbscheme
Normal file
2130
cpp/downgrades/34549c3b0937002f11037d01822ebe99442c1402/old.dbscheme
Normal file
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,4 @@
|
||||
description: Support all constant attribute arguments
|
||||
compatibility: backwards
|
||||
attribute_arg_constant.rel: delete
|
||||
attribute_args.rel: run attribute_args.qlo
|
||||
@@ -0,0 +1,4 @@
|
||||
---
|
||||
category: feature
|
||||
---
|
||||
* Added a predicate `getValueConstant` to `AttributeArgument` that yields the argument value as an `Expr` when the value is a constant expression.
|
||||
@@ -12,7 +12,7 @@ private import semmle.code.cpp.internal.ResolveClass
|
||||
class Specifier extends Element, @specifier {
|
||||
/** Gets a dummy location for the specifier. */
|
||||
override Location getLocation() {
|
||||
suppressUnusedThis(this) and
|
||||
exists(this) and
|
||||
result instanceof UnknownDefaultLocation
|
||||
}
|
||||
|
||||
@@ -256,9 +256,13 @@ class AttributeArgument extends Element, @attribute_arg {
|
||||
|
||||
/**
|
||||
* Gets the text for the value of this argument, if its value is
|
||||
* a string or a number.
|
||||
* a constant or token.
|
||||
*/
|
||||
string getValueText() { attribute_arg_value(underlyingElement(this), result) }
|
||||
string getValueText() {
|
||||
if underlyingElement(this) instanceof @attribute_arg_constant_expr
|
||||
then result = this.getValueConstant().getValue()
|
||||
else attribute_arg_value(underlyingElement(this), result)
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the value of this argument, if its value is integral.
|
||||
@@ -270,6 +274,13 @@ class AttributeArgument extends Element, @attribute_arg {
|
||||
*/
|
||||
Type getValueType() { attribute_arg_type(underlyingElement(this), unresolveElement(result)) }
|
||||
|
||||
/**
|
||||
* Gets the value of this argument, if its value is a constant.
|
||||
*/
|
||||
Expr getValueConstant() {
|
||||
attribute_arg_constant(underlyingElement(this), unresolveElement(result))
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the attribute to which this is an argument.
|
||||
*/
|
||||
@@ -294,11 +305,12 @@ class AttributeArgument extends Element, @attribute_arg {
|
||||
(
|
||||
if underlyingElement(this) instanceof @attribute_arg_type
|
||||
then tail = this.getValueType().getName()
|
||||
else tail = this.getValueText()
|
||||
else
|
||||
if underlyingElement(this) instanceof @attribute_arg_constant_expr
|
||||
then tail = this.getValueConstant().toString()
|
||||
else tail = this.getValueText()
|
||||
) and
|
||||
result = prefix + tail
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
private predicate suppressUnusedThis(Specifier s) { any() }
|
||||
|
||||
@@ -899,6 +899,7 @@ case @attribute_arg.kind of
|
||||
| 1 = @attribute_arg_token
|
||||
| 2 = @attribute_arg_constant
|
||||
| 3 = @attribute_arg_type
|
||||
| 4 = @attribute_arg_constant_expr
|
||||
;
|
||||
|
||||
attribute_arg_value(
|
||||
@@ -909,6 +910,10 @@ attribute_arg_type(
|
||||
unique int arg: @attribute_arg ref,
|
||||
int type_id: @type ref
|
||||
);
|
||||
attribute_arg_constant(
|
||||
unique int arg: @attribute_arg ref,
|
||||
int constant: @expr ref
|
||||
)
|
||||
attribute_arg_name(
|
||||
unique int arg: @attribute_arg ref,
|
||||
string name: string ref
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,2 @@
|
||||
description: Support all constant attribute arguments
|
||||
compatibility: partial
|
||||
@@ -1,3 +1,4 @@
|
||||
| strlen.cpp:7:49:7:49 | 1 |
|
||||
| strlen.cpp:11:39:11:48 | array to pointer conversion |
|
||||
| strlen.cpp:11:39:11:48 | file.ext |
|
||||
| strlen.cpp:12:35:12:40 | call to strlen |
|
||||
|
||||
Reference in New Issue
Block a user