mirror of
https://github.com/github/codeql.git
synced 2025-12-24 12:46:34 +01:00
C++: Fix mixed tabs and spaces in non-test code
This commit is contained in:
@@ -4,5 +4,5 @@ void fillRect(int x, int y, int w, int h,
|
||||
int r2, int g2, int b2, int a2,
|
||||
gradient_type grad, unsigned int flags, bool border)
|
||||
{
|
||||
// ...
|
||||
// ...
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
int find(int start, char *str, char goal)
|
||||
{
|
||||
int len = strlen(str);
|
||||
//Potential buffer overflow
|
||||
//Potential buffer overflow
|
||||
for (int i = start; str[i] != 0 && i < len; i++) {
|
||||
if (str[i] == goal)
|
||||
return i;
|
||||
@@ -12,7 +12,7 @@ int find(int start, char *str, char goal)
|
||||
int findRangeCheck(int start, char *str, char goal)
|
||||
{
|
||||
int len = strlen(str);
|
||||
//Range check protects against buffer overflow
|
||||
//Range check protects against buffer overflow
|
||||
for (int i = start; i < len && str[i] != 0 ; i++) {
|
||||
if (str[i] == goal)
|
||||
return i;
|
||||
|
||||
@@ -1,16 +1,16 @@
|
||||
void sanitize(Fields[] record) {
|
||||
//The number of fields here can be put in a const
|
||||
for (fieldCtr = 0; field < 7; field++) {
|
||||
sanitize(fields[fieldCtr]);
|
||||
}
|
||||
for (fieldCtr = 0; field < 7; field++) {
|
||||
sanitize(fields[fieldCtr]);
|
||||
}
|
||||
}
|
||||
|
||||
#define NUM_FIELDS 7
|
||||
|
||||
void process(Fields[] record) {
|
||||
//This avoids using a magic constant by using the macro instead
|
||||
for (fieldCtr = 0; field < NUM_FIELDS; field++) {
|
||||
process(fields[fieldCtr]);
|
||||
}
|
||||
//This avoids using a magic constant by using the macro instead
|
||||
for (fieldCtr = 0; field < NUM_FIELDS; field++) {
|
||||
process(fields[fieldCtr]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
//start of file
|
||||
static void f() { //static function f() is unused in the file
|
||||
//...
|
||||
//...
|
||||
}
|
||||
static void g() {
|
||||
//...
|
||||
//...
|
||||
}
|
||||
void public_func() { //non-static function public_func is not called in file,
|
||||
//but could be visible in other files
|
||||
//...
|
||||
g(); //call to g()
|
||||
//...
|
||||
//...
|
||||
g(); //call to g()
|
||||
//...
|
||||
}
|
||||
//end of file
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
typedef struct Names {
|
||||
char first[100];
|
||||
char last[100];
|
||||
char first[100];
|
||||
char last[100];
|
||||
} Names;
|
||||
|
||||
int doFoo(Names n) { //wrong: n is passed by value (meaning the entire structure
|
||||
//is copied onto the stack, instead of just a pointer)
|
||||
...
|
||||
...
|
||||
}
|
||||
|
||||
int doBar(Names &n) { //better, only a reference is passed
|
||||
...
|
||||
...
|
||||
}
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
Record records[SIZE] = ...;
|
||||
|
||||
int f() {
|
||||
int recordIdx = 0;
|
||||
recordIdx = readUserInput(); //recordIdx is returned from a function
|
||||
int recordIdx = 0;
|
||||
recordIdx = readUserInput(); //recordIdx is returned from a function
|
||||
// there is no check so it could be negative
|
||||
doFoo(&(records[recordIdx])); //but is not checked before use as an array offset
|
||||
doFoo(&(records[recordIdx])); //but is not checked before use as an array offset
|
||||
}
|
||||
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
if (!flags & SOME_BIT) { //wrong: '!' has higher precedence than '&', so this
|
||||
// is bracketed as '(!flags) & SOME_BIT', and does not
|
||||
// check whether a particular bit is set.
|
||||
// ...
|
||||
// is bracketed as '(!flags) & SOME_BIT', and does not
|
||||
// check whether a particular bit is set.
|
||||
// ...
|
||||
}
|
||||
|
||||
if ((p != NULL) & p->f()) { //wrong: The use of '&' rather than '&&' will still
|
||||
// de-reference the pointer even if it is NULL.
|
||||
// ...
|
||||
// de-reference the pointer even if it is NULL.
|
||||
// ...
|
||||
}
|
||||
|
||||
int bits = (s > 8) & 0xff; //wrong: Invalid attempt to get the 8 most significant
|
||||
|
||||
@@ -1,16 +1,16 @@
|
||||
int x1 = 0;
|
||||
for (x1 = 0; x1 < 100; x1++) {
|
||||
int x2 = 0;
|
||||
for (x1 = 0; x1 < 300; x1++) {
|
||||
int x2 = 0;
|
||||
for (x1 = 0; x1 < 300; x1++) {
|
||||
// this is most likely a typo
|
||||
// the outer loop will exit immediately
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (x1 = 0; x1 < 100; x1++) {
|
||||
if(x1 == 10 && condition) {
|
||||
for (; x1 < 75; x1++) {
|
||||
for (; x1 < 75; x1++) {
|
||||
// this should be written as a while loop
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,31 +1,31 @@
|
||||
class Base {
|
||||
public:
|
||||
Resource *p;
|
||||
Base() {
|
||||
p = createResource();
|
||||
}
|
||||
//...
|
||||
~Base() {
|
||||
//wrong: this destructor is non-virtual, but Base has a derived class
|
||||
// with a non-virtual destructor
|
||||
freeResource(p);
|
||||
}
|
||||
Resource *p;
|
||||
Base() {
|
||||
p = createResource();
|
||||
}
|
||||
//...
|
||||
~Base() {
|
||||
//wrong: this destructor is non-virtual, but Base has a derived class
|
||||
//with a non-virtual destructor
|
||||
freeResource(p);
|
||||
}
|
||||
};
|
||||
|
||||
class Derived: public Base {
|
||||
public:
|
||||
Resource *dp;
|
||||
Derived() {
|
||||
dp = createResource2();
|
||||
}
|
||||
~Derived() {
|
||||
freeResource2(dp);
|
||||
}
|
||||
Resource *dp;
|
||||
Derived() {
|
||||
dp = createResource2();
|
||||
}
|
||||
~Derived() {
|
||||
freeResource2(dp);
|
||||
}
|
||||
};
|
||||
|
||||
int f() {
|
||||
Base *b = new Derived(); //creates resources for both Base::p and Derived::dp
|
||||
//...
|
||||
delete b; //will only call Base::~Base(), leaking the resource dp.
|
||||
Base *b = new Derived(); //creates resources for both Base::p and Derived::dp
|
||||
//...
|
||||
delete b; //will only call Base::~Base(), leaking the resource dp.
|
||||
// Change both destructors to virtual to ensure they are both called.
|
||||
}
|
||||
|
||||
@@ -1,35 +1,35 @@
|
||||
class Base {
|
||||
protected:
|
||||
Resource* resource;
|
||||
Resource* resource;
|
||||
public:
|
||||
virtual void init() {
|
||||
resource = createResource();
|
||||
}
|
||||
virtual void release() {
|
||||
freeResource(resource);
|
||||
}
|
||||
virtual void init() {
|
||||
resource = createResource();
|
||||
}
|
||||
virtual void release() {
|
||||
freeResource(resource);
|
||||
}
|
||||
};
|
||||
|
||||
class Derived: public Base {
|
||||
virtual void init() {
|
||||
resource = createResourceV2();
|
||||
}
|
||||
virtual void release() {
|
||||
freeResourceV2(resource);
|
||||
}
|
||||
virtual void init() {
|
||||
resource = createResourceV2();
|
||||
}
|
||||
virtual void release() {
|
||||
freeResourceV2(resource);
|
||||
}
|
||||
};
|
||||
|
||||
Base::Base() {
|
||||
this->init();
|
||||
this->init();
|
||||
}
|
||||
Base::~Base() {
|
||||
this->release();
|
||||
this->release();
|
||||
}
|
||||
|
||||
int f() {
|
||||
// this will call Base::Base() and then Derived::Derived(), but this->init()
|
||||
// inBase::Base() will resolve to Base::init(), not Derived::init()
|
||||
// The reason for this is that when Base::Base is called, the object being
|
||||
// created is still of type Base (including the vtable)
|
||||
Derived* d = new Derived();
|
||||
// this will call Base::Base() and then Derived::Derived(), but this->init()
|
||||
// inBase::Base() will resolve to Base::init(), not Derived::init()
|
||||
// The reason for this is that when Base::Base is called, the object being
|
||||
// created is still of type Base (including the vtable)
|
||||
Derived* d = new Derived();
|
||||
}
|
||||
|
||||
@@ -1,35 +1,35 @@
|
||||
class Base {
|
||||
protected:
|
||||
Resource* resource;
|
||||
Resource* resource;
|
||||
public:
|
||||
virtual void init() {
|
||||
resource = createResource();
|
||||
}
|
||||
virtual void release() {
|
||||
freeResource(resource);
|
||||
}
|
||||
virtual void init() {
|
||||
resource = createResource();
|
||||
}
|
||||
virtual void release() {
|
||||
freeResource(resource);
|
||||
}
|
||||
};
|
||||
|
||||
class Derived: public Base {
|
||||
virtual void init() {
|
||||
resource = createResourceV2();
|
||||
}
|
||||
virtual void release() {
|
||||
freeResourceV2(resource);
|
||||
}
|
||||
virtual void init() {
|
||||
resource = createResourceV2();
|
||||
}
|
||||
virtual void release() {
|
||||
freeResourceV2(resource);
|
||||
}
|
||||
};
|
||||
|
||||
Base::Base() {
|
||||
this->init();
|
||||
this->init();
|
||||
}
|
||||
Base::~Base() {
|
||||
this->release();
|
||||
this->release();
|
||||
}
|
||||
|
||||
int f() {
|
||||
// this will call Base::Base() and then Derived::Derived(), but this->init()
|
||||
// inBase::Base() will resolve to Base::init(), not Derived::init()
|
||||
// The reason for this is that when Base::Base is called, the object being
|
||||
// created is still of type Base (including the vtable)
|
||||
Derived* d = new Derived();
|
||||
// this will call Base::Base() and then Derived::Derived(), but this->init()
|
||||
// inBase::Base() will resolve to Base::init(), not Derived::init()
|
||||
// The reason for this is that when Base::Base is called, the object being
|
||||
// created is still of type Base (including the vtable)
|
||||
Derived* d = new Derived();
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
struct X {
|
||||
//This struct will have a compiler-generated copy constructor
|
||||
//This struct will have a compiler-generated copy constructor
|
||||
X(const X&, int);
|
||||
...
|
||||
};
|
||||
@@ -7,7 +7,7 @@ struct X {
|
||||
//However, if this is declared later, it will override the compiler-generated
|
||||
//constructor
|
||||
X::X(const X& x, int i =0) {
|
||||
this-> i = i; //uses the i parameter, instead of x.i
|
||||
this-> i = i; //uses the i parameter, instead of x.i
|
||||
}
|
||||
|
||||
C c(1);
|
||||
|
||||
@@ -2,17 +2,17 @@
|
||||
// cannot close the file
|
||||
class ResourceLeak {
|
||||
private:
|
||||
int sockfd;
|
||||
FILE* file;
|
||||
int sockfd;
|
||||
FILE* file;
|
||||
public:
|
||||
C() {
|
||||
sockfd = socket(AF_INET, SOCK_STREAM, 0);
|
||||
}
|
||||
C() {
|
||||
sockfd = socket(AF_INET, SOCK_STREAM, 0);
|
||||
}
|
||||
|
||||
void f() {
|
||||
file = fopen("foo.txt", "r");
|
||||
...
|
||||
}
|
||||
void f() {
|
||||
file = fopen("foo.txt", "r");
|
||||
...
|
||||
}
|
||||
};
|
||||
|
||||
// This class relies on its client to release any stream it
|
||||
|
||||
@@ -6,13 +6,13 @@ class C : protected Superclass,
|
||||
public InterfaceA, public InterfaceB,
|
||||
private ImplementationA, private ImplementationB
|
||||
{
|
||||
//implementation
|
||||
//implementation
|
||||
};
|
||||
|
||||
//wrong: multiple protected bases
|
||||
class D : protected Superclass1, protected Superclass2,
|
||||
public Interface, private Implementation
|
||||
{
|
||||
//implementation
|
||||
//implementation
|
||||
};
|
||||
|
||||
|
||||
@@ -542,5 +542,5 @@ query predicate edges(PrintASTNode source, PrintASTNode target, string key, stri
|
||||
}
|
||||
|
||||
query predicate graphProperties(string key, string value) {
|
||||
key = "semmle.graphKind" and value = "tree"
|
||||
key = "semmle.graphKind" and value = "tree"
|
||||
}
|
||||
|
||||
@@ -5,11 +5,11 @@
|
||||
import cpp
|
||||
|
||||
string exprString(Expr e) {
|
||||
if (e instanceof ArrayToPointerConversion) then (
|
||||
result = e.(ArrayToPointerConversion).getExpr().(Literal).getValue()
|
||||
) else (
|
||||
result = e.toString()
|
||||
)
|
||||
if (e instanceof ArrayToPointerConversion) then (
|
||||
result = e.(ArrayToPointerConversion).getExpr().(Literal).getValue()
|
||||
) else (
|
||||
result = e.toString()
|
||||
)
|
||||
}
|
||||
|
||||
from Cast c, Type cType, string cTypeName, string toStruct
|
||||
|
||||
@@ -5,31 +5,31 @@
|
||||
import cpp
|
||||
|
||||
predicate nameCheck(Declaration d) {
|
||||
count(d.toString()) = 1 and
|
||||
count(string s | d.hasName(s)) = 1 and
|
||||
d.hasName(d.toString())
|
||||
count(d.toString()) = 1 and
|
||||
count(string s | d.hasName(s)) = 1 and
|
||||
d.hasName(d.toString())
|
||||
}
|
||||
|
||||
string accessType(Field f) {
|
||||
(f.isPublic() and result = "public") or
|
||||
(f.isProtected() and result = "protected") or
|
||||
(f.isPrivate() and result = "private")
|
||||
(f.isPublic() and result = "public") or
|
||||
(f.isProtected() and result = "protected") or
|
||||
(f.isPrivate() and result = "private")
|
||||
}
|
||||
|
||||
string fieldType(Field f) {
|
||||
result = f.getType().getAQlClass() and
|
||||
(
|
||||
result.matches("%Type") or
|
||||
result = "Enum"
|
||||
)
|
||||
result = f.getType().getAQlClass() and
|
||||
(
|
||||
result.matches("%Type") or
|
||||
result = "Enum"
|
||||
)
|
||||
}
|
||||
|
||||
string pointedType(Field f) {
|
||||
if f.getType() instanceof PointerType then (
|
||||
result = f.getType().(PointerType).getBaseType().toString()
|
||||
) else (
|
||||
result = ""
|
||||
)
|
||||
if f.getType() instanceof PointerType then (
|
||||
result = f.getType().(PointerType).getBaseType().toString()
|
||||
) else (
|
||||
result = ""
|
||||
)
|
||||
}
|
||||
|
||||
from Class c, Field f
|
||||
|
||||
Reference in New Issue
Block a user