mirror of
https://github.com/github/codeql.git
synced 2025-12-19 10:23:15 +01:00
99 lines
2.4 KiB
C++
99 lines
2.4 KiB
C++
//
|
|
|
|
class Base {
|
|
public:
|
|
int x;
|
|
private:
|
|
char c;
|
|
};
|
|
|
|
class Derived: public Base {
|
|
public:
|
|
int y;
|
|
};
|
|
|
|
class Derived2: public Derived {
|
|
};
|
|
|
|
class DerivedNoField: public Base {
|
|
};
|
|
|
|
class DerivedSameSize: public Base {
|
|
public:
|
|
char c2;
|
|
};
|
|
|
|
void dereference_base(Base *b) {
|
|
b[2].x;
|
|
}
|
|
|
|
void dereference_array_base(Base b[]) {
|
|
b[2].x;
|
|
}
|
|
|
|
void pointer_arith_base(Base *b) {
|
|
b + 2;
|
|
}
|
|
|
|
void dereference_derived(Derived *d) {
|
|
d[2].x;
|
|
}
|
|
|
|
void dereference_array_derived(Derived d[]) {
|
|
d[2].x;
|
|
}
|
|
|
|
void pointer_arith_derived(Derived *d) {
|
|
d + 2;
|
|
}
|
|
|
|
void char_pointer_arith(Base *b) {
|
|
((char*) b)[2];
|
|
}
|
|
|
|
void test () {
|
|
Derived d[4];
|
|
|
|
dereference_base(d); // BAD: implicit conversion to Base*
|
|
dereference_array_base(d); // BAD: implicit conversion to Base*
|
|
pointer_arith_base(d); // BAD: implicit conversion to Base*
|
|
|
|
dereference_derived(d); // GOOD: implicit conversion to Derived*, which will be the right size
|
|
dereference_array_derived(d); // GOOD: implicit conversion to Derived*, which will be the right size
|
|
pointer_arith_derived(d); // GOOD: implicit conversion to Derived*, which will be the right size
|
|
|
|
|
|
Base b[4];
|
|
|
|
dereference_base(b); // BAD: implicit conversion to Base*
|
|
dereference_array_base(b); // BAD: implicit conversion to Base*
|
|
pointer_arith_base(b); // BAD: implicit conversion to Base*
|
|
|
|
DerivedSameSize dss[4];
|
|
|
|
dereference_base(dss); // BAD: same size on Linux but different on Windows
|
|
dereference_array_base(dss); // BAD: same size on Linux but different on Windows
|
|
pointer_arith_base(dss); // BAD: same size on Linux but different on Windows
|
|
|
|
DerivedNoField dnf[4];
|
|
|
|
dereference_base(dnf); // GOOD: no new field introduced
|
|
dereference_array_base(dnf); // GOOD: no new field introduced
|
|
pointer_arith_base(dnf); // GOOD: no new field introduced
|
|
|
|
Derived2 d2[4];
|
|
|
|
dereference_base(d2); // BAD: implicit conversion to Base*
|
|
dereference_array_base(d2); // BAD: implicit conversion to Base*
|
|
pointer_arith_base(d2); // BAD: implicit conversion to Base*
|
|
|
|
dereference_derived(d2); // GOOD: implicit conversion to Derived*, which will be the right size
|
|
dereference_array_derived(d2); // GOOD: implicit conversion to Derived*, which will be the right size
|
|
pointer_arith_derived(d2); // GOOD: implicit conversion to Derived*, which will be the right size
|
|
|
|
char_pointer_arith(b); // GOOD: pointer arithmetic is done with char*
|
|
char_pointer_arith(d); // GOOD: pointer arithmetic is done with char*
|
|
char_pointer_arith(dss); // GOOD: pointer arithmetic is done with char*
|
|
|
|
}
|