mirror of
https://github.com/github/codeql.git
synced 2026-04-27 17:55:19 +02:00
Merge branch 'main' into mad
This commit is contained in:
@@ -105,10 +105,24 @@ ConditionDecl.cpp:
|
||||
# 3| getVariableAccess(): [VariableAccess] k
|
||||
# 3| Type = [IntType] int
|
||||
# 3| ValueCategory = prvalue(load)
|
||||
# 3| getInitializingExpr(): [LTExpr] ... < ...
|
||||
# 3| Type = [BoolType] bool
|
||||
# 3| ValueCategory = prvalue
|
||||
# 3| getLesserOperand(): [VariableAccess] j
|
||||
# 3| Type = [IntType] int
|
||||
# 3| ValueCategory = prvalue(load)
|
||||
# 3| getGreaterOperand(): [Literal] 5
|
||||
# 3| Type = [IntType] int
|
||||
# 3| Value = [Literal] 5
|
||||
# 3| ValueCategory = prvalue
|
||||
# 3| getVariableAccess().getFullyConverted(): [CStyleCast] (bool)...
|
||||
# 3| Conversion = [BoolConversion] conversion to bool
|
||||
# 3| Type = [BoolType] bool
|
||||
# 3| ValueCategory = prvalue
|
||||
# 3| getInitializingExpr().getFullyConverted(): [CStyleCast] (int)...
|
||||
# 3| Conversion = [IntegralConversion] integral conversion
|
||||
# 3| Type = [IntType] int
|
||||
# 3| ValueCategory = prvalue
|
||||
# 3| getStmt(): [BlockStmt] { ... }
|
||||
# 5| getStmt(2): [ReturnStmt] return ...
|
||||
ConstructorCall.cpp:
|
||||
@@ -412,11 +426,14 @@ DestructorCall.cpp:
|
||||
# 12| getQualifier(): [VariableAccess] c
|
||||
# 12| Type = [PointerType] C *
|
||||
# 12| ValueCategory = prvalue(load)
|
||||
# 12| getExprWithReuse(): [ReuseExpr] reuse of c
|
||||
# 12| Type = [PointerType] C *
|
||||
# 12| ValueCategory = prvalue
|
||||
# 13| getStmt(1): [ExprStmt] ExprStmt
|
||||
# 13| getExpr(): [DeleteExpr] delete
|
||||
# 13| Type = [VoidType] void
|
||||
# 13| ValueCategory = prvalue
|
||||
# 13| getExpr(): [VariableAccess] d
|
||||
# 13| getExprWithReuse(): [VariableAccess] d
|
||||
# 13| Type = [PointerType] D *
|
||||
# 13| ValueCategory = prvalue(load)
|
||||
# 14| getStmt(2): [ReturnStmt] return ...
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
experimental/Security/CWE/CWE-416/IteratorToExpiredContainer.ql
|
||||
@@ -0,0 +1,768 @@
|
||||
|
||||
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;
|
||||
|
||||
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;
|
||||
|
||||
|
||||
namespace std
|
||||
{
|
||||
template<class T> constexpr T&& forward(remove_reference_t<T>& t) noexcept;
|
||||
template<class T> constexpr T&& forward(remove_reference_t<T>&& t) noexcept;
|
||||
}
|
||||
|
||||
// --- iterator ---
|
||||
|
||||
namespace std {
|
||||
struct ptrdiff_t;
|
||||
|
||||
template<class I> struct iterator_traits;
|
||||
|
||||
template <class Category,
|
||||
class value_type,
|
||||
class difference_type = ptrdiff_t,
|
||||
class pointer_type = value_type*,
|
||||
class reference_type = value_type&>
|
||||
struct iterator {
|
||||
typedef Category iterator_category;
|
||||
|
||||
iterator();
|
||||
iterator(iterator<Category, remove_const_t<value_type> > const &other); // non-const -> const conversion constructor
|
||||
|
||||
iterator &operator++();
|
||||
iterator operator++(int);
|
||||
iterator &operator--();
|
||||
iterator operator--(int);
|
||||
bool operator==(iterator other) const;
|
||||
bool operator!=(iterator other) const;
|
||||
reference_type operator*() const;
|
||||
pointer_type operator->() const;
|
||||
iterator operator+(int);
|
||||
iterator operator-(int);
|
||||
iterator &operator+=(int);
|
||||
iterator &operator-=(int);
|
||||
int operator-(iterator);
|
||||
reference_type operator[](int);
|
||||
};
|
||||
|
||||
struct input_iterator_tag {};
|
||||
struct forward_iterator_tag : public input_iterator_tag {};
|
||||
struct bidirectional_iterator_tag : public forward_iterator_tag {};
|
||||
struct random_access_iterator_tag : public bidirectional_iterator_tag {};
|
||||
|
||||
struct output_iterator_tag {};
|
||||
|
||||
template<class Container>
|
||||
class back_insert_iterator {
|
||||
protected:
|
||||
Container* container = nullptr;
|
||||
public:
|
||||
using iterator_category = output_iterator_tag;
|
||||
using value_type = void;
|
||||
using difference_type = ptrdiff_t;
|
||||
using pointer = void;
|
||||
using reference = void;
|
||||
using container_type = Container;
|
||||
constexpr back_insert_iterator() noexcept = default;
|
||||
constexpr explicit back_insert_iterator(Container& x);
|
||||
back_insert_iterator& operator=(const typename Container::value_type& value);
|
||||
back_insert_iterator& operator=(typename Container::value_type&& value);
|
||||
back_insert_iterator& operator*();
|
||||
back_insert_iterator& operator++();
|
||||
back_insert_iterator operator++(int);
|
||||
};
|
||||
|
||||
template<class Container>
|
||||
constexpr back_insert_iterator<Container> back_inserter(Container& x) {
|
||||
return back_insert_iterator<Container>(x);
|
||||
}
|
||||
|
||||
template<class Container>
|
||||
class front_insert_iterator {
|
||||
protected:
|
||||
Container* container = nullptr;
|
||||
public:
|
||||
using iterator_category = output_iterator_tag;
|
||||
using value_type = void;
|
||||
using difference_type = ptrdiff_t;
|
||||
using pointer = void;
|
||||
using reference = void;
|
||||
using container_type = Container;
|
||||
constexpr front_insert_iterator() noexcept = default;
|
||||
constexpr explicit front_insert_iterator(Container& x);
|
||||
constexpr front_insert_iterator& operator=(const typename Container::value_type& value);
|
||||
constexpr front_insert_iterator& operator=(typename Container::value_type&& value);
|
||||
constexpr front_insert_iterator& operator*();
|
||||
constexpr front_insert_iterator& operator++();
|
||||
constexpr front_insert_iterator operator++(int);
|
||||
};
|
||||
template<class Container>
|
||||
constexpr front_insert_iterator<Container> front_inserter(Container& x) {
|
||||
return front_insert_iterator<Container>(x);
|
||||
}
|
||||
}
|
||||
|
||||
// --- string ---
|
||||
|
||||
namespace std
|
||||
{
|
||||
template<class charT> struct char_traits;
|
||||
|
||||
typedef size_t streamsize;
|
||||
|
||||
template <class T> class allocator {
|
||||
public:
|
||||
allocator() throw();
|
||||
typedef size_t size_type;
|
||||
};
|
||||
|
||||
template<class charT, class traits = char_traits<charT>, class Allocator = allocator<charT> >
|
||||
class basic_string {
|
||||
public:
|
||||
using value_type = charT;
|
||||
using reference = value_type&;
|
||||
using const_reference = const value_type&;
|
||||
typedef typename Allocator::size_type size_type;
|
||||
static const size_type npos = -1;
|
||||
|
||||
explicit basic_string(const Allocator& a = Allocator());
|
||||
basic_string(const charT* s, const Allocator& a = Allocator());
|
||||
template<class InputIterator> basic_string(InputIterator begin, InputIterator end, const Allocator& a = Allocator());
|
||||
|
||||
const charT* c_str() const;
|
||||
charT* data() noexcept;
|
||||
size_t length() const;
|
||||
|
||||
typedef std::iterator<random_access_iterator_tag, charT> iterator;
|
||||
typedef std::iterator<random_access_iterator_tag, const charT> const_iterator;
|
||||
|
||||
iterator begin();
|
||||
iterator end();
|
||||
const_iterator begin() const;
|
||||
const_iterator end() const;
|
||||
const_iterator cbegin() const;
|
||||
const_iterator cend() const;
|
||||
|
||||
void push_back(charT c);
|
||||
|
||||
const charT& front() const;
|
||||
charT& front();
|
||||
const charT& back() const;
|
||||
charT& back();
|
||||
|
||||
const_reference operator[](size_type pos) const;
|
||||
reference operator[](size_type pos);
|
||||
const_reference at(size_type n) const;
|
||||
reference at(size_type n);
|
||||
template<class T> basic_string& operator+=(const T& t);
|
||||
basic_string& operator+=(const charT* s);
|
||||
basic_string& append(const basic_string& str);
|
||||
basic_string& append(const charT* s);
|
||||
basic_string& append(size_type n, charT c);
|
||||
template<class InputIterator> basic_string& append(InputIterator first, InputIterator last);
|
||||
basic_string& assign(const basic_string& str);
|
||||
basic_string& assign(size_type n, charT c);
|
||||
template<class InputIterator> basic_string& assign(InputIterator first, InputIterator last);
|
||||
basic_string& insert(size_type pos, const basic_string& str);
|
||||
basic_string& insert(size_type pos, size_type n, charT c);
|
||||
basic_string& insert(size_type pos, const charT* s);
|
||||
iterator insert(const_iterator p, size_type n, charT c);
|
||||
template<class InputIterator> iterator insert(const_iterator p, InputIterator first, InputIterator last);
|
||||
basic_string& replace(size_type pos1, size_type n1, const basic_string& str);
|
||||
basic_string& replace(size_type pos1, size_type n1, size_type n2, charT c);
|
||||
size_type copy(charT* s, size_type n, size_type pos = 0) const;
|
||||
void clear() noexcept;
|
||||
basic_string substr(size_type pos = 0, size_type n = npos) const;
|
||||
void swap(basic_string& s) noexcept/*(allocator_traits<Allocator>::propagate_on_container_swap::value || allocator_traits<Allocator>::is_always_equal::value)*/;
|
||||
};
|
||||
|
||||
template<class charT, class traits, class Allocator> basic_string<charT, traits, Allocator> operator+(const basic_string<charT, traits, Allocator>& lhs, const basic_string<charT, traits, Allocator>& rhs);
|
||||
template<class charT, class traits, class Allocator> basic_string<charT, traits, Allocator> operator+(const basic_string<charT, traits, Allocator>& lhs, const charT* rhs);
|
||||
|
||||
typedef basic_string<char> string;
|
||||
}
|
||||
|
||||
// --- istring / ostream / stringstream ---
|
||||
|
||||
namespace std
|
||||
{
|
||||
template <class charT, class traits = char_traits<charT> >
|
||||
class basic_istream /*: virtual public basic_ios<charT,traits> - not needed for this test */ {
|
||||
public:
|
||||
using char_type = charT;
|
||||
using int_type = int; //typename traits::int_type;
|
||||
|
||||
basic_istream<charT, traits>& operator>>(int& n);
|
||||
|
||||
int_type get();
|
||||
basic_istream<charT, traits>& get(char_type& c);
|
||||
basic_istream<charT, traits>& get(char_type* s, streamsize n);
|
||||
int_type peek();
|
||||
basic_istream<charT, traits>& read (char_type* s, streamsize n);
|
||||
streamsize readsome(char_type* s, streamsize n);
|
||||
basic_istream<charT, traits>& putback(char_type c);
|
||||
basic_istream<charT,traits>& unget();
|
||||
|
||||
basic_istream<charT,traits>& getline(char_type* s, streamsize n);
|
||||
basic_istream<charT,traits>& getline(char_type* s, streamsize n, char_type delim);
|
||||
};
|
||||
|
||||
template<class charT, class traits> basic_istream<charT, traits>& operator>>(basic_istream<charT, traits>&, charT*);
|
||||
template<class charT, class traits, class Allocator> basic_istream<charT, traits>& operator>>(basic_istream<charT, traits>& is, basic_string<charT, traits, Allocator>& str);
|
||||
|
||||
template<class charT, class traits, class Allocator> basic_istream<charT,traits>& getline(basic_istream<charT,traits>& is, basic_string<charT,traits,Allocator>& str, charT delim);
|
||||
template<class charT, class traits, class Allocator> basic_istream<charT,traits>& getline(basic_istream<charT,traits>& is, basic_string<charT,traits,Allocator>& str);
|
||||
|
||||
template <class charT, class traits = char_traits<charT> >
|
||||
class basic_ostream /*: virtual public basic_ios<charT,traits> - not needed for this test */ {
|
||||
public:
|
||||
typedef charT char_type;
|
||||
|
||||
basic_ostream<charT, traits>& operator<<(int n);
|
||||
|
||||
basic_ostream<charT, traits>& put(char_type c);
|
||||
basic_ostream<charT, traits>& write(const char_type* s, streamsize n);
|
||||
basic_ostream<charT,traits>& flush();
|
||||
};
|
||||
|
||||
template<class charT, class traits> basic_ostream<charT,traits>& operator<<(basic_ostream<charT,traits>&, const charT*);
|
||||
template<class charT, class traits, class Allocator> basic_ostream<charT, traits>& operator<<(basic_ostream<charT, traits>& os, const basic_string<charT, traits, Allocator>& str);
|
||||
|
||||
template<class charT, class traits = char_traits<charT>>
|
||||
class basic_iostream : public basic_istream<charT, traits>, public basic_ostream<charT, traits> {
|
||||
public:
|
||||
};
|
||||
|
||||
template<class charT, class traits = char_traits<charT>, class Allocator = allocator<charT>>
|
||||
class basic_stringstream : public basic_iostream<charT, traits> {
|
||||
public:
|
||||
explicit basic_stringstream(/*ios_base::openmode which = ios_base::out|ios_base::in - not needed for this test*/);
|
||||
explicit basic_stringstream( const basic_string<charT, traits, Allocator>& str/*, ios_base::openmode which = ios_base::out | ios_base::in*/);
|
||||
basic_stringstream(const basic_stringstream& rhs) = delete;
|
||||
basic_stringstream(basic_stringstream&& rhs);
|
||||
basic_stringstream& operator=(const basic_stringstream& rhs) = delete;
|
||||
basic_stringstream& operator=(basic_stringstream&& rhs);
|
||||
|
||||
void swap(basic_stringstream& rhs);
|
||||
|
||||
basic_string<charT, traits, Allocator> str() const;
|
||||
void str(const basic_string<charT, traits, Allocator>& str);
|
||||
};
|
||||
|
||||
typedef basic_istream<char> istream;
|
||||
typedef basic_ostream<char> ostream;
|
||||
extern istream cin;
|
||||
extern ostream cout;
|
||||
|
||||
using stringstream = basic_stringstream<char>;
|
||||
}
|
||||
|
||||
// --- vector ---
|
||||
|
||||
namespace std {
|
||||
template<class T, class Allocator = allocator<T>>
|
||||
class vector {
|
||||
public:
|
||||
using value_type = T;
|
||||
using reference = value_type&;
|
||||
using const_reference = const value_type&;
|
||||
using size_type = unsigned int;
|
||||
using iterator = std::iterator<random_access_iterator_tag, T>;
|
||||
using const_iterator = std::iterator<random_access_iterator_tag, const T>;
|
||||
|
||||
vector() noexcept(noexcept(Allocator()));
|
||||
vector(const std::vector<T, Allocator>&);
|
||||
explicit vector(const Allocator&) noexcept;
|
||||
explicit vector(size_type n, const Allocator& = Allocator());
|
||||
vector(size_type n, const T& value, const Allocator& = Allocator());
|
||||
template<class InputIterator, class IteratorCategory = typename InputIterator::iterator_category> vector(InputIterator first, InputIterator last, const Allocator& = Allocator());
|
||||
// use of `iterator_category` makes sure InputIterator is (probably) an iterator, and not an `int` or
|
||||
// similar that should match a different overload (SFINAE).
|
||||
~vector();
|
||||
|
||||
vector& operator=(const vector& x);
|
||||
vector& operator=(vector&& x) noexcept/*(allocator_traits<Allocator>::propagate_on_container_move_assignment::value || allocator_traits<Allocator>::is_always_equal::value)*/;
|
||||
template<class InputIterator, class IteratorCategory = typename InputIterator::iterator_category> void assign(InputIterator first, InputIterator last);
|
||||
// use of `iterator_category` makes sure InputIterator is (probably) an iterator, and not an `int` or
|
||||
// similar that should match a different overload (SFINAE).
|
||||
void assign(size_type n, const T& u);
|
||||
|
||||
iterator begin() noexcept;
|
||||
const_iterator begin() const noexcept;
|
||||
iterator end() noexcept;
|
||||
const_iterator end() const noexcept;
|
||||
|
||||
size_type size() const noexcept;
|
||||
|
||||
reference operator[](size_type n);
|
||||
const_reference operator[](size_type n) const;
|
||||
const_reference at(size_type n) const;
|
||||
reference at(size_type n);
|
||||
reference front();
|
||||
const_reference front() const;
|
||||
reference back();
|
||||
const_reference back() const;
|
||||
|
||||
T* data() noexcept;
|
||||
const T* data() const noexcept;
|
||||
|
||||
void push_back(const T& x);
|
||||
void push_back(T&& x);
|
||||
|
||||
iterator insert(const_iterator position, const T& x);
|
||||
iterator insert(const_iterator position, T&& x);
|
||||
iterator insert(const_iterator position, size_type n, const T& x);
|
||||
template<class InputIterator> iterator insert(const_iterator position, InputIterator first, InputIterator last);
|
||||
|
||||
template <class... Args> iterator emplace (const_iterator position, Args&&... args);
|
||||
template <class... Args> void emplace_back (Args&&... args);
|
||||
|
||||
void swap(vector&) noexcept/*(allocator_traits<Allocator>::propagate_on_container_swap::value || allocator_traits<Allocator>::is_always_equal::value)*/;
|
||||
|
||||
void clear() noexcept;
|
||||
};
|
||||
}
|
||||
|
||||
// --- make_shared / make_unique ---
|
||||
|
||||
namespace std {
|
||||
template<typename T>
|
||||
class shared_ptr {
|
||||
public:
|
||||
shared_ptr() noexcept;
|
||||
explicit shared_ptr(T*);
|
||||
shared_ptr(const shared_ptr&) noexcept;
|
||||
template<class U> shared_ptr(const shared_ptr<U>&) noexcept;
|
||||
template<class U> shared_ptr(shared_ptr<U>&&) noexcept;
|
||||
|
||||
shared_ptr<T>& operator=(const shared_ptr<T>&) noexcept;
|
||||
shared_ptr<T>& operator=(shared_ptr<T>&&) noexcept;
|
||||
|
||||
T& operator*() const noexcept;
|
||||
T* operator->() const noexcept;
|
||||
|
||||
T* get() const noexcept;
|
||||
};
|
||||
|
||||
template<typename T>
|
||||
class unique_ptr {
|
||||
public:
|
||||
constexpr unique_ptr() noexcept;
|
||||
explicit unique_ptr(T*) noexcept;
|
||||
unique_ptr(unique_ptr<T>&&) noexcept;
|
||||
|
||||
unique_ptr<T>& operator=(unique_ptr<T>&&) noexcept;
|
||||
|
||||
T& operator*() const;
|
||||
T* operator->() const noexcept;
|
||||
|
||||
T* get() const noexcept;
|
||||
};
|
||||
|
||||
template<typename T, class... Args> unique_ptr<T> make_unique(Args&&...);
|
||||
|
||||
template<typename T, class... Args> shared_ptr<T> make_shared(Args&&...);
|
||||
}
|
||||
|
||||
// --- pair ---
|
||||
|
||||
namespace std {
|
||||
template <class T1, class T2>
|
||||
struct pair {
|
||||
typedef T1 first_type;
|
||||
typedef T2 second_type;
|
||||
|
||||
T1 first;
|
||||
T2 second;
|
||||
pair();
|
||||
pair(const T1& x, const T2& y);
|
||||
template<class U, class V> pair(const pair<U, V> &p);
|
||||
|
||||
void swap(pair& p) /*noexcept(...)*/;
|
||||
};
|
||||
|
||||
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));
|
||||
}
|
||||
}
|
||||
|
||||
// --- map ---
|
||||
|
||||
namespace std {
|
||||
template<class T = void> struct less;
|
||||
|
||||
template<class Key, class T, class Compare = less<Key>, class Allocator = allocator<pair<const Key, T>>>
|
||||
class map {
|
||||
public:
|
||||
using key_type = Key;
|
||||
using mapped_type = T;
|
||||
using value_type = pair<const Key, T>;
|
||||
using iterator = std::iterator<random_access_iterator_tag, value_type >;
|
||||
using const_iterator = std::iterator<random_access_iterator_tag, const value_type >;
|
||||
|
||||
map();
|
||||
map(const map& x);
|
||||
map(map&& x);
|
||||
~map();
|
||||
|
||||
map& operator=(const map& x);
|
||||
map& operator=(map&& x) /*noexcept(allocator_traits<Allocator>::is_always_equal::value && is_nothrow_move_assignable_v<Compare>)*/;
|
||||
|
||||
iterator begin() noexcept;
|
||||
const_iterator begin() const noexcept;
|
||||
iterator end() noexcept;
|
||||
const_iterator end() const noexcept;
|
||||
|
||||
T& operator[](const key_type& x);
|
||||
T& operator[](key_type&& x);
|
||||
T& at(const key_type& x);
|
||||
const T& at(const key_type& x) const;
|
||||
|
||||
template<class... Args> pair<iterator, bool> emplace(Args&&... args);
|
||||
template<class... Args> iterator emplace_hint(const_iterator position, Args&&... args);
|
||||
|
||||
pair<iterator, bool> insert(const value_type& x);
|
||||
pair<iterator, bool> insert(value_type&& x);
|
||||
iterator insert(const_iterator position, const value_type& x);
|
||||
iterator insert(const_iterator position, value_type&& x);
|
||||
|
||||
template<class... Args> pair<iterator, bool> try_emplace(const key_type& k, Args&&... args);
|
||||
template<class... Args> pair<iterator, bool> try_emplace(key_type&& k, Args&&... args);
|
||||
template<class... Args> iterator try_emplace(const_iterator hint, const key_type& k, Args&&... args);
|
||||
template<class... Args> iterator try_emplace(const_iterator hint, key_type&& k, Args&&... args);
|
||||
template<class M> pair<iterator, bool> insert_or_assign(const key_type& k, M&& obj);
|
||||
template<class M> pair<iterator, bool> insert_or_assign(key_type&& k, M&& obj);
|
||||
template<class M> iterator insert_or_assign(const_iterator hint, const key_type& k, M&& obj);
|
||||
template<class M> iterator insert_or_assign(const_iterator hint, key_type&& k, M&& obj);
|
||||
|
||||
iterator erase(iterator position);
|
||||
iterator erase(const_iterator position);
|
||||
iterator erase(const_iterator first, const_iterator last);
|
||||
void swap(map&) /*noexcept(/*==allocator_traits<Allocator>::is_always_equal::value && is_nothrow_swappable_v<Compare>)*/;
|
||||
void clear() noexcept;
|
||||
|
||||
template<class C2> void merge(map<Key, T, C2, Allocator>& source);
|
||||
template<class C2> void merge(map<Key, T, C2, Allocator>&& source);
|
||||
|
||||
iterator find(const key_type& x);
|
||||
const_iterator find(const key_type& x) const;
|
||||
|
||||
iterator lower_bound(const key_type& x);
|
||||
const_iterator lower_bound(const key_type& x) const;
|
||||
iterator upper_bound(const key_type& x);
|
||||
const_iterator upper_bound(const key_type& x) const;
|
||||
|
||||
pair<iterator, iterator> equal_range(const key_type& x);
|
||||
pair<const_iterator, const_iterator> equal_range(const key_type& x) const;
|
||||
};
|
||||
|
||||
template<class T> struct hash;
|
||||
template<class T = void> struct equal_to;
|
||||
|
||||
template<class Key, class T, class Hash = hash<Key>, class Pred = equal_to<Key>, class Allocator = allocator<pair<const Key, T>>>
|
||||
class unordered_map {
|
||||
public:
|
||||
using key_type = Key;
|
||||
using mapped_type = T;
|
||||
using value_type = pair<const Key, T>;
|
||||
using iterator = std::iterator<random_access_iterator_tag, value_type >;
|
||||
using const_iterator = std::iterator<random_access_iterator_tag, const value_type >;
|
||||
|
||||
unordered_map();
|
||||
unordered_map(const unordered_map&);
|
||||
unordered_map(unordered_map&&);
|
||||
~unordered_map();
|
||||
|
||||
unordered_map& operator=(const unordered_map&);
|
||||
unordered_map& operator=(unordered_map&&) /*noexcept(allocator_traits<Allocator>::is_always_equal::value && is_nothrow_move_assignable_v<Hash> && is_nothrow_move_assignable_v<Pred>)*/;
|
||||
|
||||
iterator begin() noexcept;
|
||||
const_iterator begin() const noexcept;
|
||||
iterator end() noexcept;
|
||||
const_iterator end() const noexcept;
|
||||
|
||||
mapped_type& operator[](const key_type& k);
|
||||
mapped_type& operator[](key_type&& k);
|
||||
mapped_type& at(const key_type& k);
|
||||
const mapped_type& at(const key_type& k) const;
|
||||
|
||||
template<class... Args> pair<iterator, bool> emplace(Args&&... args);
|
||||
template<class... Args> iterator emplace_hint(const_iterator position, Args&&... args);
|
||||
|
||||
pair<iterator, bool> insert(const value_type& obj);
|
||||
pair<iterator, bool> insert(value_type&& obj);
|
||||
iterator insert(const_iterator hint, const value_type& obj);
|
||||
iterator insert(const_iterator hint, value_type&& obj);
|
||||
|
||||
template<class... Args> pair<iterator, bool> try_emplace(const key_type& k, Args&&... args);
|
||||
template<class... Args> pair<iterator, bool> try_emplace(key_type&& k, Args&&... args);
|
||||
template<class... Args> iterator try_emplace(const_iterator hint, const key_type& k, Args&&... args);
|
||||
template<class... Args> iterator try_emplace(const_iterator hint, key_type&& k, Args&&... args);
|
||||
template<class M> pair<iterator, bool> insert_or_assign(const key_type& k, M&& obj);
|
||||
template<class M> pair<iterator, bool> insert_or_assign(key_type&& k, M&& obj);
|
||||
template<class M> iterator insert_or_assign(const_iterator hint, const key_type& k, M&& obj);
|
||||
template<class M> iterator insert_or_assign(const_iterator hint, key_type&& k, M&& obj);
|
||||
|
||||
iterator erase(iterator position);
|
||||
iterator erase(const_iterator position);
|
||||
iterator erase(const_iterator first, const_iterator last);
|
||||
void swap(unordered_map&) /*noexcept(allocator_traits<Allocator>::is_always_equal::value && is_nothrow_swappable_v<Hash> && is_nothrow_swappable_v<Pred>)*/;
|
||||
void clear() noexcept;
|
||||
|
||||
template<class H2, class P2> void merge(unordered_map<Key, T, H2, P2, Allocator>& source);
|
||||
template<class H2, class P2> void merge(unordered_map<Key, T, H2, P2, Allocator>&& source);
|
||||
|
||||
iterator find(const key_type& k);
|
||||
const_iterator find(const key_type& k) const;
|
||||
|
||||
pair<iterator, iterator> equal_range(const key_type& k);
|
||||
pair<const_iterator, const_iterator> equal_range(const key_type& k) const;
|
||||
};
|
||||
};
|
||||
|
||||
// --- set ---
|
||||
|
||||
namespace std {
|
||||
template<class Key, class Compare = less<Key>, class Allocator = allocator<Key>>
|
||||
class set {
|
||||
public:
|
||||
using key_type = Key;
|
||||
using value_type = Key;
|
||||
using size_type = size_t;
|
||||
using allocator_type = Allocator;
|
||||
using iterator = std::iterator<random_access_iterator_tag, value_type >;
|
||||
using const_iterator = std::iterator<random_access_iterator_tag, const value_type >;
|
||||
|
||||
set();
|
||||
set(const set& x);
|
||||
set(set&& x);
|
||||
template<class InputIterator> set(InputIterator first, InputIterator last/*, const Compare& comp = Compare(), const Allocator& = Allocator()*/);
|
||||
~set();
|
||||
|
||||
set& operator=(const set& x);
|
||||
set& operator=(set&& x) noexcept/*(allocator_traits<Allocator>::is_always_equal::value && is_nothrow_move_assignable_v<Compare>)*/;
|
||||
|
||||
iterator begin() noexcept;
|
||||
const_iterator begin() const noexcept;
|
||||
iterator end() noexcept;
|
||||
const_iterator end() const noexcept;
|
||||
|
||||
template<class... Args> pair<iterator, bool> emplace(Args&&... args);
|
||||
template<class... Args> iterator emplace_hint(const_iterator position, Args&&... args);
|
||||
pair<iterator,bool> insert(const value_type& x);
|
||||
pair<iterator,bool> insert(value_type&& x);
|
||||
iterator insert(const_iterator position, const value_type& x);
|
||||
iterator insert(const_iterator position, value_type&& x);
|
||||
template<class InputIterator> void insert(InputIterator first, InputIterator last);
|
||||
|
||||
iterator erase(iterator position);
|
||||
iterator erase(const_iterator position);
|
||||
iterator erase(const_iterator first, const_iterator last);
|
||||
void swap(set&) noexcept/*(allocator_traits<Allocator>::is_always_equal::value && is_nothrow_swappable_v<Compare>)*/;
|
||||
void clear() noexcept;
|
||||
|
||||
template<class C2> void merge(set<Key, C2, Allocator>& source);
|
||||
template<class C2> void merge(set<Key, C2, Allocator>&& source);
|
||||
|
||||
iterator find(const key_type& x);
|
||||
const_iterator find(const key_type& x) const;
|
||||
|
||||
iterator lower_bound(const key_type& x);
|
||||
const_iterator lower_bound(const key_type& x) const;
|
||||
iterator upper_bound(const key_type& x);
|
||||
const_iterator upper_bound(const key_type& x) const;
|
||||
pair<iterator, iterator> equal_range(const key_type& x);
|
||||
pair<const_iterator, const_iterator> equal_range(const key_type& x) const;
|
||||
};
|
||||
|
||||
template<class Key, class Hash = hash<Key>, class Pred = equal_to<Key>, class Allocator = allocator<Key>>
|
||||
class unordered_set {
|
||||
public:
|
||||
using key_type = Key;
|
||||
using value_type = Key;
|
||||
using hasher = Hash;
|
||||
using key_equal = Pred;
|
||||
using allocator_type = Allocator;
|
||||
using size_type = size_t;
|
||||
using iterator = std::iterator<random_access_iterator_tag, value_type >;
|
||||
using const_iterator = std::iterator<random_access_iterator_tag, const value_type >;
|
||||
|
||||
unordered_set();
|
||||
unordered_set(const unordered_set&);
|
||||
unordered_set(unordered_set&&);
|
||||
template<class InputIterator> unordered_set(InputIterator f, InputIterator l, size_type n = 0/*, const hasher& hf = hasher(), const key_equal& eql = key_equal(), const allocator_type& a = allocator_type()*/);
|
||||
~unordered_set();
|
||||
|
||||
unordered_set& operator=(const unordered_set&);
|
||||
unordered_set& operator=(unordered_set&&) noexcept/*(allocator_traits<Allocator>::is_always_equal::value && is_nothrow_move_assignable_v<Hash> && is_nothrow_move_assignable_v<Pred>)*/;
|
||||
|
||||
iterator begin() noexcept;
|
||||
const_iterator begin() const noexcept;
|
||||
iterator end() noexcept;
|
||||
const_iterator end() const noexcept;
|
||||
|
||||
template<class... Args> pair<iterator, bool> emplace(Args&&... args);
|
||||
template<class... Args> iterator emplace_hint(const_iterator position, Args&&... args);
|
||||
pair<iterator, bool> insert(const value_type& obj);
|
||||
pair<iterator, bool> insert(value_type&& obj);
|
||||
iterator insert(const_iterator hint, const value_type& obj);
|
||||
iterator insert(const_iterator hint, value_type&& obj);
|
||||
template<class InputIterator> void insert(InputIterator first, InputIterator last);
|
||||
|
||||
iterator erase(iterator position);
|
||||
iterator erase(const_iterator position);
|
||||
iterator erase(const_iterator first, const_iterator last);
|
||||
void swap(unordered_set&) noexcept/*(allocator_traits<Allocator>::is_always_equal::value && is_nothrow_swappable_v<Hash> && is_nothrow_swappable_v<Pred>)*/;
|
||||
void clear() noexcept;
|
||||
|
||||
template<class H2, class P2> void merge(unordered_set<Key, H2, P2, Allocator>& source);
|
||||
template<class H2, class P2> void merge(unordered_set<Key, H2, P2, Allocator>&& source);
|
||||
|
||||
iterator find(const key_type& k);
|
||||
const_iterator find(const key_type& k) const;
|
||||
pair<iterator, iterator> equal_range(const key_type& k);
|
||||
pair<const_iterator, const_iterator> equal_range(const key_type& k) const;
|
||||
};
|
||||
}
|
||||
|
||||
std::vector<std::vector<int>> returnValue();
|
||||
std::vector<std::vector<int>>& returnRef();
|
||||
|
||||
std::vector<std::vector<int>> external_by_value(std::vector<std::vector<int>>);
|
||||
|
||||
std::vector<std::vector<int>> external_by_const_ref(const std::vector<std::vector<int>>&);
|
||||
|
||||
// *: Will be detected once extract destruction of unnamed temporaries and generate IR for them
|
||||
|
||||
const std::vector<std::vector<int>>& return_self_by_ref(const std::vector<std::vector<int>>& v) {
|
||||
return v;
|
||||
}
|
||||
|
||||
std::vector<std::vector<int>> return_self_by_value(const std::vector<std::vector<int>>& v) {
|
||||
return v;
|
||||
}
|
||||
|
||||
void test() {
|
||||
for (auto x : returnValue()) {} // GOOD
|
||||
for (auto x : returnValue()[0]) {} // BAD [NOT DETECTED] (see *)
|
||||
for (auto x : external_by_value(returnValue())) {} // GOOD
|
||||
for (auto x : external_by_const_ref(returnValue())) {} // GOOD
|
||||
for (auto x : returnValue().at(0)) {} // BAD [NOT DETECTED] (see *)
|
||||
|
||||
for (auto x : returnRef()) {} // GOOD
|
||||
for (auto x : returnRef()[0]) {} // GOOD
|
||||
for (auto x : returnRef().at(0)) {} // GOOD
|
||||
|
||||
for(auto it = returnValue().begin(); it != returnValue().end(); ++it) {} // BAD
|
||||
|
||||
{
|
||||
auto v = returnValue();
|
||||
for(auto it = v.begin(); it != v.end(); ++it) {} // GOOD
|
||||
}
|
||||
|
||||
{
|
||||
auto&& v = returnValue();
|
||||
for(auto it = v.begin(); it != v.end(); ++it) {} // GOOD
|
||||
}
|
||||
|
||||
{
|
||||
auto&& v = returnValue()[0];
|
||||
for(auto it = v.begin(); it != v.end(); ++it) {} // BAD [NOT DETECTED] (see *)
|
||||
}
|
||||
|
||||
{
|
||||
auto&& v = returnRef();
|
||||
for(auto it = v.begin(); it != v.end(); ++it) {} // GOOD
|
||||
}
|
||||
|
||||
{
|
||||
auto&& v = returnRef()[0];
|
||||
for(auto it = v.begin(); it != v.end(); ++it) {} // GOOD
|
||||
}
|
||||
|
||||
for (auto x : return_self_by_ref(returnValue())) {} // BAD [NOT DETECTED] (see *)
|
||||
|
||||
for (auto x : return_self_by_value(returnValue())) {} // GOOD
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
void iterate(const std::vector<T>& v) {
|
||||
for (auto x : v) {}
|
||||
}
|
||||
|
||||
std::vector<int>& ref_to_first_in_returnValue_1() {
|
||||
return returnValue()[0]; // BAD [NOT DETECTED] (see *)
|
||||
}
|
||||
|
||||
std::vector<int>& ref_to_first_in_returnValue_2() {
|
||||
return returnValue()[0]; // BAD [NOT DETECTED]
|
||||
}
|
||||
|
||||
std::vector<int>& ref_to_first_in_returnValue_3() {
|
||||
return returnValue()[0]; // BAD [NOT DETECTED] (see *)
|
||||
}
|
||||
|
||||
std::vector<int> first_in_returnValue_1() {
|
||||
return returnValue()[0]; // GOOD
|
||||
}
|
||||
|
||||
std::vector<int> first_in_returnValue_2() {
|
||||
return returnValue()[0]; // GOOD
|
||||
}
|
||||
|
||||
void test2() {
|
||||
iterate(returnValue()); // GOOD
|
||||
iterate(returnValue()[0]); // GOOD
|
||||
|
||||
for (auto x : ref_to_first_in_returnValue_1()) {}
|
||||
|
||||
{
|
||||
auto value = ref_to_first_in_returnValue_2();
|
||||
for (auto x : value) {}
|
||||
}
|
||||
|
||||
{
|
||||
auto& ref = ref_to_first_in_returnValue_3();
|
||||
for (auto x : ref) {}
|
||||
}
|
||||
|
||||
for (auto x : first_in_returnValue_1()) {}
|
||||
|
||||
{
|
||||
auto value = first_in_returnValue_2();
|
||||
for (auto x : value) {}
|
||||
}
|
||||
}
|
||||
@@ -14,6 +14,7 @@
|
||||
| cpp.cpp:10:7:10:7 | operator= | Function |
|
||||
| cpp.cpp:10:7:10:7 | ~MyClass | Function |
|
||||
| cpp.cpp:15:5:15:12 | call to ~MyClass | Expr |
|
||||
| cpp.cpp:15:12:15:12 | reuse of m | Expr |
|
||||
| cpp.cpp:16:1:16:1 | return ... | Stmt |
|
||||
| file://:0:0:0:0 | operator delete | Function |
|
||||
| file://:0:0:0:0 | operator new | Function |
|
||||
|
||||
@@ -62,7 +62,9 @@ astGuardsCompare
|
||||
| 26 | x >= 0+1 when ... > ... is true |
|
||||
| 31 | - ... != x+0 when ... == ... is false |
|
||||
| 31 | - ... == x+0 when ... == ... is true |
|
||||
| 31 | x != -1 when ... == ... is false |
|
||||
| 31 | x != - ...+0 when ... == ... is false |
|
||||
| 31 | x == -1 when ... == ... is true |
|
||||
| 31 | x == - ...+0 when ... == ... is true |
|
||||
| 34 | 10 < j+1 when ... < ... is false |
|
||||
| 34 | 10 >= j+1 when ... < ... is true |
|
||||
@@ -86,15 +88,20 @@ astGuardsCompare
|
||||
| 58 | 0 < y+1 when ... \|\| ... is false |
|
||||
| 58 | 0 == x+0 when ... == ... is true |
|
||||
| 58 | 0 >= y+1 when ... < ... is true |
|
||||
| 58 | x != 0 when ... == ... is false |
|
||||
| 58 | x != 0 when ... \|\| ... is false |
|
||||
| 58 | x != 0+0 when ... == ... is false |
|
||||
| 58 | x != 0+0 when ... \|\| ... is false |
|
||||
| 58 | x == 0 when ... == ... is true |
|
||||
| 58 | x == 0+0 when ... == ... is true |
|
||||
| 58 | y < 0+0 when ... < ... is true |
|
||||
| 58 | y >= 0+0 when ... < ... is false |
|
||||
| 58 | y >= 0+0 when ... \|\| ... is false |
|
||||
| 75 | 0 != x+0 when ... == ... is false |
|
||||
| 75 | 0 == x+0 when ... == ... is true |
|
||||
| 75 | x != 0 when ... == ... is false |
|
||||
| 75 | x != 0+0 when ... == ... is false |
|
||||
| 75 | x == 0 when ... == ... is true |
|
||||
| 75 | x == 0+0 when ... == ... is true |
|
||||
| 85 | 0 != x+0 when ... == ... is false |
|
||||
| 85 | 0 != y+0 when ... != ... is true |
|
||||
@@ -102,15 +109,23 @@ astGuardsCompare
|
||||
| 85 | 0 == x+0 when ... && ... is true |
|
||||
| 85 | 0 == x+0 when ... == ... is true |
|
||||
| 85 | 0 == y+0 when ... != ... is false |
|
||||
| 85 | x != 0 when ... == ... is false |
|
||||
| 85 | x != 0+0 when ... == ... is false |
|
||||
| 85 | x == 0 when ... && ... is true |
|
||||
| 85 | x == 0 when ... == ... is true |
|
||||
| 85 | x == 0+0 when ... && ... is true |
|
||||
| 85 | x == 0+0 when ... == ... is true |
|
||||
| 85 | y != 0 when ... != ... is true |
|
||||
| 85 | y != 0 when ... && ... is true |
|
||||
| 85 | y != 0+0 when ... != ... is true |
|
||||
| 85 | y != 0+0 when ... && ... is true |
|
||||
| 85 | y == 0 when ... != ... is false |
|
||||
| 85 | y == 0+0 when ... != ... is false |
|
||||
| 94 | 0 != x+0 when ... != ... is true |
|
||||
| 94 | 0 == x+0 when ... != ... is false |
|
||||
| 94 | x != 0 when ... != ... is true |
|
||||
| 94 | x != 0+0 when ... != ... is true |
|
||||
| 94 | x == 0 when ... != ... is false |
|
||||
| 94 | x == 0+0 when ... != ... is false |
|
||||
| 102 | 10 < j+1 when ... < ... is false |
|
||||
| 102 | 10 >= j+1 when ... < ... is true |
|
||||
@@ -122,8 +137,11 @@ astGuardsCompare
|
||||
| 109 | 0 < y+1 when ... \|\| ... is false |
|
||||
| 109 | 0 == x+0 when ... == ... is true |
|
||||
| 109 | 0 >= y+1 when ... < ... is true |
|
||||
| 109 | x != 0 when ... == ... is false |
|
||||
| 109 | x != 0 when ... \|\| ... is false |
|
||||
| 109 | x != 0+0 when ... == ... is false |
|
||||
| 109 | x != 0+0 when ... \|\| ... is false |
|
||||
| 109 | x == 0 when ... == ... is true |
|
||||
| 109 | x == 0+0 when ... == ... is true |
|
||||
| 109 | y < 0+0 when ... < ... is true |
|
||||
| 109 | y >= 0+0 when ... < ... is false |
|
||||
@@ -162,7 +180,9 @@ astGuardsCompare
|
||||
| 165 | y >= x+43 when ... < ... is true |
|
||||
| 175 | 0 != call to foo+0 when ... == ... is false |
|
||||
| 175 | 0 == call to foo+0 when ... == ... is true |
|
||||
| 175 | call to foo != 0 when ... == ... is false |
|
||||
| 175 | call to foo != 0+0 when ... == ... is false |
|
||||
| 175 | call to foo == 0 when ... == ... is true |
|
||||
| 175 | call to foo == 0+0 when ... == ... is true |
|
||||
astGuardsControl
|
||||
| test.c:7:9:7:13 | ... > ... | false | 10 | 11 |
|
||||
@@ -443,6 +463,34 @@ astGuardsEnsure
|
||||
| test.cpp:31:7:31:13 | ... == ... | test.cpp:31:12:31:13 | - ... | != | test.cpp:31:7:31:7 | x | 0 | 34 | 34 |
|
||||
| test.cpp:31:7:31:13 | ... == ... | test.cpp:31:12:31:13 | - ... | == | test.cpp:31:7:31:7 | x | 0 | 30 | 30 |
|
||||
| test.cpp:31:7:31:13 | ... == ... | test.cpp:31:12:31:13 | - ... | == | test.cpp:31:7:31:7 | x | 0 | 31 | 32 |
|
||||
astGuardsEnsure_const
|
||||
| test.c:58:9:58:14 | ... == ... | test.c:58:9:58:9 | x | != | 0 | 58 | 58 |
|
||||
| test.c:58:9:58:14 | ... == ... | test.c:58:9:58:9 | x | != | 0 | 62 | 62 |
|
||||
| test.c:58:9:58:23 | ... \|\| ... | test.c:58:9:58:9 | x | != | 0 | 62 | 62 |
|
||||
| test.c:75:9:75:14 | ... == ... | test.c:75:9:75:9 | x | != | 0 | 78 | 79 |
|
||||
| test.c:75:9:75:14 | ... == ... | test.c:75:9:75:9 | x | == | 0 | 75 | 77 |
|
||||
| test.c:85:8:85:13 | ... == ... | test.c:85:8:85:8 | x | == | 0 | 85 | 85 |
|
||||
| test.c:85:8:85:13 | ... == ... | test.c:85:8:85:8 | x | == | 0 | 86 | 86 |
|
||||
| test.c:85:8:85:23 | ... && ... | test.c:85:8:85:8 | x | == | 0 | 86 | 86 |
|
||||
| test.c:85:8:85:23 | ... && ... | test.c:85:18:85:18 | y | != | 0 | 86 | 86 |
|
||||
| test.c:85:18:85:23 | ... != ... | test.c:85:18:85:18 | y | != | 0 | 86 | 86 |
|
||||
| test.c:94:11:94:16 | ... != ... | test.c:94:11:94:11 | x | != | 0 | 94 | 96 |
|
||||
| test.c:94:11:94:16 | ... != ... | test.c:94:11:94:11 | x | == | 0 | 70 | 70 |
|
||||
| test.c:94:11:94:16 | ... != ... | test.c:94:11:94:11 | x | == | 0 | 99 | 102 |
|
||||
| test.c:94:11:94:16 | ... != ... | test.c:94:11:94:11 | x | == | 0 | 102 | 102 |
|
||||
| test.c:94:11:94:16 | ... != ... | test.c:94:11:94:11 | x | == | 0 | 107 | 109 |
|
||||
| test.c:94:11:94:16 | ... != ... | test.c:94:11:94:11 | x | == | 0 | 109 | 109 |
|
||||
| test.c:94:11:94:16 | ... != ... | test.c:94:11:94:11 | x | == | 0 | 109 | 117 |
|
||||
| test.c:94:11:94:16 | ... != ... | test.c:94:11:94:11 | x | == | 0 | 113 | 113 |
|
||||
| test.c:109:9:109:14 | ... == ... | test.c:109:9:109:9 | x | != | 0 | 109 | 109 |
|
||||
| test.c:109:9:109:14 | ... == ... | test.c:109:9:109:9 | x | != | 0 | 113 | 113 |
|
||||
| test.c:109:9:109:23 | ... \|\| ... | test.c:109:9:109:9 | x | != | 0 | 113 | 113 |
|
||||
| test.c:175:13:175:32 | ... == ... | test.c:175:13:175:15 | call to foo | != | 0 | 175 | 175 |
|
||||
| test.c:175:13:175:32 | ... == ... | test.c:175:13:175:15 | call to foo | == | 0 | 175 | 175 |
|
||||
| test.cpp:31:7:31:13 | ... == ... | test.cpp:31:7:31:7 | x | != | -1 | 30 | 30 |
|
||||
| test.cpp:31:7:31:13 | ... == ... | test.cpp:31:7:31:7 | x | != | -1 | 34 | 34 |
|
||||
| test.cpp:31:7:31:13 | ... == ... | test.cpp:31:7:31:7 | x | == | -1 | 30 | 30 |
|
||||
| test.cpp:31:7:31:13 | ... == ... | test.cpp:31:7:31:7 | x | == | -1 | 31 | 32 |
|
||||
irGuards
|
||||
| test.c:7:9:7:13 | CompareGT: ... > ... |
|
||||
| test.c:17:8:17:12 | CompareLT: ... < ... |
|
||||
@@ -482,74 +530,110 @@ irGuardsCompare
|
||||
| 7 | 0 < x+0 when CompareGT: ... > ... is true |
|
||||
| 7 | 0 >= x+0 when CompareGT: ... > ... is false |
|
||||
| 7 | x < 0+1 when CompareGT: ... > ... is false |
|
||||
| 7 | x < 1 when CompareGT: ... > ... is false |
|
||||
| 7 | x >= 0+1 when CompareGT: ... > ... is true |
|
||||
| 7 | x >= 1 when CompareGT: ... > ... is true |
|
||||
| 17 | 0 < x+1 when CompareLT: ... < ... is false |
|
||||
| 17 | 0 >= x+1 when CompareLT: ... < ... is true |
|
||||
| 17 | 1 < y+0 when CompareGT: ... > ... is true |
|
||||
| 17 | 1 >= y+0 when CompareGT: ... > ... is false |
|
||||
| 17 | x < 0 when CompareLT: ... < ... is true |
|
||||
| 17 | x < 0+0 when CompareLT: ... < ... is true |
|
||||
| 17 | x >= 0 when CompareLT: ... < ... is false |
|
||||
| 17 | x >= 0+0 when CompareLT: ... < ... is false |
|
||||
| 17 | y < 1+1 when CompareGT: ... > ... is false |
|
||||
| 17 | y < 2 when CompareGT: ... > ... is false |
|
||||
| 17 | y >= 1+1 when CompareGT: ... > ... is true |
|
||||
| 17 | y >= 2 when CompareGT: ... > ... is true |
|
||||
| 26 | 0 < x+0 when CompareGT: ... > ... is true |
|
||||
| 26 | 0 >= x+0 when CompareGT: ... > ... is false |
|
||||
| 26 | x < 0+1 when CompareGT: ... > ... is false |
|
||||
| 26 | x < 1 when CompareGT: ... > ... is false |
|
||||
| 26 | x >= 0+1 when CompareGT: ... > ... is true |
|
||||
| 26 | x >= 1 when CompareGT: ... > ... is true |
|
||||
| 31 | - ... != x+0 when CompareEQ: ... == ... is false |
|
||||
| 31 | - ... == x+0 when CompareEQ: ... == ... is true |
|
||||
| 31 | x != -1 when CompareEQ: ... == ... is false |
|
||||
| 31 | x != - ...+0 when CompareEQ: ... == ... is false |
|
||||
| 31 | x == -1 when CompareEQ: ... == ... is true |
|
||||
| 31 | x == - ...+0 when CompareEQ: ... == ... is true |
|
||||
| 34 | 10 < j+1 when CompareLT: ... < ... is false |
|
||||
| 34 | 10 >= j+1 when CompareLT: ... < ... is true |
|
||||
| 34 | j < 10 when CompareLT: ... < ... is true |
|
||||
| 34 | j < 10+0 when CompareLT: ... < ... is true |
|
||||
| 34 | j >= 10 when CompareLT: ... < ... is false |
|
||||
| 34 | j >= 10+0 when CompareLT: ... < ... is false |
|
||||
| 42 | 10 < j+1 when CompareLT: ... < ... is false |
|
||||
| 42 | 10 >= j+1 when CompareLT: ... < ... is true |
|
||||
| 42 | j < 10 when CompareLT: ... < ... is true |
|
||||
| 42 | j < 10+0 when CompareLT: ... < ... is true |
|
||||
| 42 | j >= 10 when CompareLT: ... < ... is false |
|
||||
| 42 | j >= 10+0 when CompareLT: ... < ... is false |
|
||||
| 44 | 0 < z+0 when CompareGT: ... > ... is true |
|
||||
| 44 | 0 >= z+0 when CompareGT: ... > ... is false |
|
||||
| 44 | z < 0+1 when CompareGT: ... > ... is false |
|
||||
| 44 | z < 1 when CompareGT: ... > ... is false |
|
||||
| 44 | z >= 0+1 when CompareGT: ... > ... is true |
|
||||
| 44 | z >= 1 when CompareGT: ... > ... is true |
|
||||
| 45 | 0 < y+0 when CompareGT: ... > ... is true |
|
||||
| 45 | 0 >= y+0 when CompareGT: ... > ... is false |
|
||||
| 45 | y < 0+1 when CompareGT: ... > ... is false |
|
||||
| 45 | y < 1 when CompareGT: ... > ... is false |
|
||||
| 45 | y >= 0+1 when CompareGT: ... > ... is true |
|
||||
| 45 | y >= 1 when CompareGT: ... > ... is true |
|
||||
| 58 | 0 != x+0 when CompareEQ: ... == ... is false |
|
||||
| 58 | 0 < y+1 when CompareLT: ... < ... is false |
|
||||
| 58 | 0 == x+0 when CompareEQ: ... == ... is true |
|
||||
| 58 | 0 >= y+1 when CompareLT: ... < ... is true |
|
||||
| 58 | x != 0 when CompareEQ: ... == ... is false |
|
||||
| 58 | x != 0+0 when CompareEQ: ... == ... is false |
|
||||
| 58 | x == 0 when CompareEQ: ... == ... is true |
|
||||
| 58 | x == 0+0 when CompareEQ: ... == ... is true |
|
||||
| 58 | y < 0 when CompareLT: ... < ... is true |
|
||||
| 58 | y < 0+0 when CompareLT: ... < ... is true |
|
||||
| 58 | y >= 0 when CompareLT: ... < ... is false |
|
||||
| 58 | y >= 0+0 when CompareLT: ... < ... is false |
|
||||
| 75 | 0 != x+0 when CompareEQ: ... == ... is false |
|
||||
| 75 | 0 == x+0 when CompareEQ: ... == ... is true |
|
||||
| 75 | x != 0 when CompareEQ: ... == ... is false |
|
||||
| 75 | x != 0+0 when CompareEQ: ... == ... is false |
|
||||
| 75 | x == 0 when CompareEQ: ... == ... is true |
|
||||
| 75 | x == 0+0 when CompareEQ: ... == ... is true |
|
||||
| 85 | 0 != x+0 when CompareEQ: ... == ... is false |
|
||||
| 85 | 0 != y+0 when CompareNE: ... != ... is true |
|
||||
| 85 | 0 == x+0 when CompareEQ: ... == ... is true |
|
||||
| 85 | 0 == y+0 when CompareNE: ... != ... is false |
|
||||
| 85 | x != 0 when CompareEQ: ... == ... is false |
|
||||
| 85 | x != 0+0 when CompareEQ: ... == ... is false |
|
||||
| 85 | x == 0 when CompareEQ: ... == ... is true |
|
||||
| 85 | x == 0+0 when CompareEQ: ... == ... is true |
|
||||
| 85 | y != 0 when CompareNE: ... != ... is true |
|
||||
| 85 | y != 0+0 when CompareNE: ... != ... is true |
|
||||
| 85 | y == 0 when CompareNE: ... != ... is false |
|
||||
| 85 | y == 0+0 when CompareNE: ... != ... is false |
|
||||
| 94 | 0 != x+0 when CompareNE: ... != ... is true |
|
||||
| 94 | 0 == x+0 when CompareNE: ... != ... is false |
|
||||
| 94 | x != 0 when CompareNE: ... != ... is true |
|
||||
| 94 | x != 0+0 when CompareNE: ... != ... is true |
|
||||
| 94 | x == 0 when CompareNE: ... != ... is false |
|
||||
| 94 | x == 0+0 when CompareNE: ... != ... is false |
|
||||
| 102 | 10 < j+1 when CompareLT: ... < ... is false |
|
||||
| 102 | 10 >= j+1 when CompareLT: ... < ... is true |
|
||||
| 102 | j < 10 when CompareLT: ... < ... is true |
|
||||
| 102 | j < 10+0 when CompareLT: ... < ... is true |
|
||||
| 102 | j >= 10 when CompareLT: ... < ... is false |
|
||||
| 102 | j >= 10+0 when CompareLT: ... < ... is false |
|
||||
| 109 | 0 != x+0 when CompareEQ: ... == ... is false |
|
||||
| 109 | 0 < y+1 when CompareLT: ... < ... is false |
|
||||
| 109 | 0 == x+0 when CompareEQ: ... == ... is true |
|
||||
| 109 | 0 >= y+1 when CompareLT: ... < ... is true |
|
||||
| 109 | x != 0 when CompareEQ: ... == ... is false |
|
||||
| 109 | x != 0+0 when CompareEQ: ... == ... is false |
|
||||
| 109 | x == 0 when CompareEQ: ... == ... is true |
|
||||
| 109 | x == 0+0 when CompareEQ: ... == ... is true |
|
||||
| 109 | y < 0 when CompareLT: ... < ... is true |
|
||||
| 109 | y < 0+0 when CompareLT: ... < ... is true |
|
||||
| 109 | y >= 0 when CompareLT: ... < ... is false |
|
||||
| 109 | y >= 0+0 when CompareLT: ... < ... is false |
|
||||
| 156 | ... + ... != x+0 when CompareEQ: ... == ... is false |
|
||||
| 156 | ... + ... == x+0 when CompareEQ: ... == ... is true |
|
||||
@@ -585,7 +669,9 @@ irGuardsCompare
|
||||
| 165 | y >= x+43 when CompareLT: ... < ... is true |
|
||||
| 175 | 0 != call to foo+0 when CompareEQ: ... == ... is false |
|
||||
| 175 | 0 == call to foo+0 when CompareEQ: ... == ... is true |
|
||||
| 175 | call to foo != 0 when CompareEQ: ... == ... is false |
|
||||
| 175 | call to foo != 0+0 when CompareEQ: ... == ... is false |
|
||||
| 175 | call to foo == 0 when CompareEQ: ... == ... is true |
|
||||
| 175 | call to foo == 0+0 when CompareEQ: ... == ... is true |
|
||||
irGuardsControl
|
||||
| test.c:7:9:7:13 | CompareGT: ... > ... | false | 11 | 11 |
|
||||
@@ -841,3 +927,75 @@ irGuardsEnsure
|
||||
| test.cpp:31:7:31:13 | CompareEQ: ... == ... | test.cpp:31:12:31:13 | Constant: - ... | != | test.cpp:31:7:31:7 | Load: x | 0 | 34 | 34 |
|
||||
| test.cpp:31:7:31:13 | CompareEQ: ... == ... | test.cpp:31:12:31:13 | Constant: - ... | == | test.cpp:31:7:31:7 | Load: x | 0 | 30 | 30 |
|
||||
| test.cpp:31:7:31:13 | CompareEQ: ... == ... | test.cpp:31:12:31:13 | Constant: - ... | == | test.cpp:31:7:31:7 | Load: x | 0 | 32 | 32 |
|
||||
irGuardsEnsure_const
|
||||
| test.c:7:9:7:13 | CompareGT: ... > ... | test.c:7:9:7:9 | Load: x | < | 1 | 11 | 11 |
|
||||
| test.c:7:9:7:13 | CompareGT: ... > ... | test.c:7:9:7:9 | Load: x | >= | 1 | 8 | 8 |
|
||||
| test.c:17:8:17:12 | CompareLT: ... < ... | test.c:17:8:17:8 | Load: x | < | 0 | 17 | 17 |
|
||||
| test.c:17:8:17:12 | CompareLT: ... < ... | test.c:17:8:17:8 | Load: x | < | 0 | 18 | 18 |
|
||||
| test.c:17:17:17:21 | CompareGT: ... > ... | test.c:17:17:17:17 | Load: y | >= | 2 | 18 | 18 |
|
||||
| test.c:26:11:26:15 | CompareGT: ... > ... | test.c:26:11:26:11 | Load: x | < | 1 | 2 | 2 |
|
||||
| test.c:26:11:26:15 | CompareGT: ... > ... | test.c:26:11:26:11 | Load: x | < | 1 | 31 | 31 |
|
||||
| test.c:26:11:26:15 | CompareGT: ... > ... | test.c:26:11:26:11 | Load: x | < | 1 | 34 | 34 |
|
||||
| test.c:26:11:26:15 | CompareGT: ... > ... | test.c:26:11:26:11 | Load: x | < | 1 | 35 | 35 |
|
||||
| test.c:26:11:26:15 | CompareGT: ... > ... | test.c:26:11:26:11 | Load: x | < | 1 | 39 | 39 |
|
||||
| test.c:26:11:26:15 | CompareGT: ... > ... | test.c:26:11:26:11 | Load: x | < | 1 | 42 | 42 |
|
||||
| test.c:26:11:26:15 | CompareGT: ... > ... | test.c:26:11:26:11 | Load: x | < | 1 | 43 | 43 |
|
||||
| test.c:26:11:26:15 | CompareGT: ... > ... | test.c:26:11:26:11 | Load: x | < | 1 | 45 | 45 |
|
||||
| test.c:26:11:26:15 | CompareGT: ... > ... | test.c:26:11:26:11 | Load: x | < | 1 | 46 | 46 |
|
||||
| test.c:26:11:26:15 | CompareGT: ... > ... | test.c:26:11:26:11 | Load: x | < | 1 | 52 | 52 |
|
||||
| test.c:26:11:26:15 | CompareGT: ... > ... | test.c:26:11:26:11 | Load: x | < | 1 | 56 | 56 |
|
||||
| test.c:26:11:26:15 | CompareGT: ... > ... | test.c:26:11:26:11 | Load: x | < | 1 | 58 | 58 |
|
||||
| test.c:26:11:26:15 | CompareGT: ... > ... | test.c:26:11:26:11 | Load: x | < | 1 | 59 | 59 |
|
||||
| test.c:26:11:26:15 | CompareGT: ... > ... | test.c:26:11:26:11 | Load: x | < | 1 | 62 | 62 |
|
||||
| test.c:26:11:26:15 | CompareGT: ... > ... | test.c:26:11:26:11 | Load: x | >= | 1 | 27 | 27 |
|
||||
| test.c:34:16:34:21 | CompareLT: ... < ... | test.c:34:16:34:16 | Load: j | < | 10 | 35 | 35 |
|
||||
| test.c:34:16:34:21 | CompareLT: ... < ... | test.c:34:16:34:16 | Load: j | >= | 10 | 2 | 2 |
|
||||
| test.c:34:16:34:21 | CompareLT: ... < ... | test.c:34:16:34:16 | Load: j | >= | 10 | 39 | 39 |
|
||||
| test.c:34:16:34:21 | CompareLT: ... < ... | test.c:34:16:34:16 | Load: j | >= | 10 | 42 | 42 |
|
||||
| test.c:34:16:34:21 | CompareLT: ... < ... | test.c:34:16:34:16 | Load: j | >= | 10 | 43 | 43 |
|
||||
| test.c:34:16:34:21 | CompareLT: ... < ... | test.c:34:16:34:16 | Load: j | >= | 10 | 45 | 45 |
|
||||
| test.c:34:16:34:21 | CompareLT: ... < ... | test.c:34:16:34:16 | Load: j | >= | 10 | 46 | 46 |
|
||||
| test.c:34:16:34:21 | CompareLT: ... < ... | test.c:34:16:34:16 | Load: j | >= | 10 | 52 | 52 |
|
||||
| test.c:34:16:34:21 | CompareLT: ... < ... | test.c:34:16:34:16 | Load: j | >= | 10 | 56 | 56 |
|
||||
| test.c:34:16:34:21 | CompareLT: ... < ... | test.c:34:16:34:16 | Load: j | >= | 10 | 58 | 58 |
|
||||
| test.c:34:16:34:21 | CompareLT: ... < ... | test.c:34:16:34:16 | Load: j | >= | 10 | 59 | 59 |
|
||||
| test.c:34:16:34:21 | CompareLT: ... < ... | test.c:34:16:34:16 | Load: j | >= | 10 | 62 | 62 |
|
||||
| test.c:42:16:42:21 | CompareLT: ... < ... | test.c:42:16:42:16 | Load: j | < | 10 | 43 | 43 |
|
||||
| test.c:42:16:42:21 | CompareLT: ... < ... | test.c:42:16:42:16 | Load: j | < | 10 | 45 | 45 |
|
||||
| test.c:42:16:42:21 | CompareLT: ... < ... | test.c:42:16:42:16 | Load: j | < | 10 | 46 | 46 |
|
||||
| test.c:42:16:42:21 | CompareLT: ... < ... | test.c:42:16:42:16 | Load: j | < | 10 | 52 | 52 |
|
||||
| test.c:44:12:44:16 | CompareGT: ... > ... | test.c:44:12:44:12 | Load: z | < | 1 | 52 | 52 |
|
||||
| test.c:44:12:44:16 | CompareGT: ... > ... | test.c:44:12:44:12 | Load: z | >= | 1 | 45 | 45 |
|
||||
| test.c:44:12:44:16 | CompareGT: ... > ... | test.c:44:12:44:12 | Load: z | >= | 1 | 46 | 46 |
|
||||
| test.c:45:16:45:20 | CompareGT: ... > ... | test.c:45:16:45:16 | Load: y | >= | 1 | 46 | 46 |
|
||||
| test.c:58:9:58:14 | CompareEQ: ... == ... | test.c:58:9:58:9 | Load: x | != | 0 | 58 | 58 |
|
||||
| test.c:58:9:58:14 | CompareEQ: ... == ... | test.c:58:9:58:9 | Load: x | != | 0 | 62 | 62 |
|
||||
| test.c:58:19:58:23 | CompareLT: ... < ... | test.c:58:19:58:19 | Load: y | >= | 0 | 62 | 62 |
|
||||
| test.c:75:9:75:14 | CompareEQ: ... == ... | test.c:75:9:75:9 | Load: x | != | 0 | 79 | 79 |
|
||||
| test.c:75:9:75:14 | CompareEQ: ... == ... | test.c:75:9:75:9 | Load: x | == | 0 | 76 | 76 |
|
||||
| test.c:85:8:85:13 | CompareEQ: ... == ... | test.c:85:8:85:8 | Load: x | == | 0 | 85 | 85 |
|
||||
| test.c:85:8:85:13 | CompareEQ: ... == ... | test.c:85:8:85:8 | Load: x | == | 0 | 86 | 86 |
|
||||
| test.c:85:18:85:23 | CompareNE: ... != ... | test.c:85:18:85:18 | Load: y | != | 0 | 86 | 86 |
|
||||
| test.c:94:11:94:16 | CompareNE: ... != ... | test.c:94:11:94:11 | Load: x | != | 0 | 95 | 95 |
|
||||
| test.c:94:11:94:16 | CompareNE: ... != ... | test.c:94:11:94:11 | Load: x | == | 0 | 70 | 70 |
|
||||
| test.c:94:11:94:16 | CompareNE: ... != ... | test.c:94:11:94:11 | Load: x | == | 0 | 99 | 99 |
|
||||
| test.c:94:11:94:16 | CompareNE: ... != ... | test.c:94:11:94:11 | Load: x | == | 0 | 102 | 102 |
|
||||
| test.c:94:11:94:16 | CompareNE: ... != ... | test.c:94:11:94:11 | Load: x | == | 0 | 103 | 103 |
|
||||
| test.c:94:11:94:16 | CompareNE: ... != ... | test.c:94:11:94:11 | Load: x | == | 0 | 107 | 107 |
|
||||
| test.c:94:11:94:16 | CompareNE: ... != ... | test.c:94:11:94:11 | Load: x | == | 0 | 109 | 109 |
|
||||
| test.c:94:11:94:16 | CompareNE: ... != ... | test.c:94:11:94:11 | Load: x | == | 0 | 110 | 110 |
|
||||
| test.c:94:11:94:16 | CompareNE: ... != ... | test.c:94:11:94:11 | Load: x | == | 0 | 113 | 113 |
|
||||
| test.c:102:16:102:21 | CompareLT: ... < ... | test.c:102:16:102:16 | Load: j | < | 10 | 103 | 103 |
|
||||
| test.c:102:16:102:21 | CompareLT: ... < ... | test.c:102:16:102:16 | Load: j | >= | 10 | 70 | 70 |
|
||||
| test.c:102:16:102:21 | CompareLT: ... < ... | test.c:102:16:102:16 | Load: j | >= | 10 | 107 | 107 |
|
||||
| test.c:102:16:102:21 | CompareLT: ... < ... | test.c:102:16:102:16 | Load: j | >= | 10 | 109 | 109 |
|
||||
| test.c:102:16:102:21 | CompareLT: ... < ... | test.c:102:16:102:16 | Load: j | >= | 10 | 110 | 110 |
|
||||
| test.c:102:16:102:21 | CompareLT: ... < ... | test.c:102:16:102:16 | Load: j | >= | 10 | 113 | 113 |
|
||||
| test.c:109:9:109:14 | CompareEQ: ... == ... | test.c:109:9:109:9 | Load: x | != | 0 | 109 | 109 |
|
||||
| test.c:109:9:109:14 | CompareEQ: ... == ... | test.c:109:9:109:9 | Load: x | != | 0 | 113 | 113 |
|
||||
| test.c:109:19:109:23 | CompareLT: ... < ... | test.c:109:19:109:19 | Load: y | >= | 0 | 113 | 113 |
|
||||
| test.c:175:13:175:32 | CompareEQ: ... == ... | test.c:175:13:175:15 | Call: call to foo | != | 0 | 175 | 175 |
|
||||
| test.c:175:13:175:32 | CompareEQ: ... == ... | test.c:175:13:175:15 | Call: call to foo | == | 0 | 175 | 175 |
|
||||
| test.cpp:31:7:31:13 | CompareEQ: ... == ... | test.cpp:31:7:31:7 | Load: x | != | -1 | 34 | 34 |
|
||||
| test.cpp:31:7:31:13 | CompareEQ: ... == ... | test.cpp:31:7:31:7 | Load: x | == | -1 | 30 | 30 |
|
||||
| test.cpp:31:7:31:13 | CompareEQ: ... == ... | test.cpp:31:7:31:7 | Load: x | == | -1 | 32 | 32 |
|
||||
|
||||
@@ -4,22 +4,34 @@ import semmle.code.cpp.controlflow.IRGuards
|
||||
query predicate astGuards(GuardCondition guard) { any() }
|
||||
|
||||
query predicate astGuardsCompare(int startLine, string msg) {
|
||||
exists(GuardCondition guard, Expr left, Expr right, int k, string which, string op |
|
||||
exists(boolean sense |
|
||||
exists(GuardCondition guard, Expr left, int k, string op |
|
||||
exists(boolean sense, string which |
|
||||
sense = true and which = "true"
|
||||
or
|
||||
sense = false and which = "false"
|
||||
|
|
||||
guard.comparesLt(left, right, k, true, sense) and op = " < "
|
||||
exists(Expr right |
|
||||
guard.comparesLt(left, right, k, true, sense) and op = " < "
|
||||
or
|
||||
guard.comparesLt(left, right, k, false, sense) and op = " >= "
|
||||
or
|
||||
guard.comparesEq(left, right, k, true, sense) and op = " == "
|
||||
or
|
||||
guard.comparesEq(left, right, k, false, sense) and op = " != "
|
||||
|
|
||||
msg = left + op + right + "+" + k + " when " + guard + " is " + which
|
||||
)
|
||||
)
|
||||
or
|
||||
exists(AbstractValue value |
|
||||
guard.comparesEq(left, k, true, value) and op = " == "
|
||||
or
|
||||
guard.comparesLt(left, right, k, false, sense) and op = " >= "
|
||||
or
|
||||
guard.comparesEq(left, right, k, true, sense) and op = " == "
|
||||
or
|
||||
guard.comparesEq(left, right, k, false, sense) and op = " != "
|
||||
) and
|
||||
startLine = guard.getLocation().getStartLine() and
|
||||
msg = left + op + right + "+" + k + " when " + guard + " is " + which
|
||||
guard.comparesEq(left, k, false, value) and op = " != "
|
||||
|
|
||||
msg = left + op + k + " when " + guard + " is " + value
|
||||
)
|
||||
|
|
||||
startLine = guard.getLocation().getStartLine()
|
||||
)
|
||||
}
|
||||
|
||||
@@ -46,28 +58,58 @@ query predicate astGuardsEnsure(
|
||||
)
|
||||
}
|
||||
|
||||
query predicate astGuardsEnsure_const(
|
||||
GuardCondition guard, Expr left, string op, int k, int start, int end
|
||||
) {
|
||||
exists(BasicBlock block |
|
||||
guard.ensuresEq(left, k, block, true) and op = "=="
|
||||
or
|
||||
guard.ensuresEq(left, k, block, false) and op = "!="
|
||||
|
|
||||
block.hasLocationInfo(_, start, _, end, _)
|
||||
)
|
||||
}
|
||||
|
||||
query predicate irGuards(IRGuardCondition guard) { any() }
|
||||
|
||||
query predicate irGuardsCompare(int startLine, string msg) {
|
||||
exists(IRGuardCondition guard, Operand left, Operand right, int k, string which, string op |
|
||||
exists(boolean sense |
|
||||
exists(IRGuardCondition guard, Operand left, int k, string op |
|
||||
exists(boolean sense, string which |
|
||||
sense = true and which = "true"
|
||||
or
|
||||
sense = false and which = "false"
|
||||
|
|
||||
guard.comparesLt(left, right, k, true, sense) and op = " < "
|
||||
exists(Operand right |
|
||||
guard.comparesLt(left, right, k, true, sense) and op = " < "
|
||||
or
|
||||
guard.comparesLt(left, right, k, false, sense) and op = " >= "
|
||||
or
|
||||
guard.comparesEq(left, right, k, true, sense) and op = " == "
|
||||
or
|
||||
guard.comparesEq(left, right, k, false, sense) and op = " != "
|
||||
|
|
||||
msg =
|
||||
left.getAnyDef().getUnconvertedResultExpression() + op +
|
||||
right.getAnyDef().getUnconvertedResultExpression() + "+" + k + " when " + guard + " is "
|
||||
+ which
|
||||
)
|
||||
)
|
||||
or
|
||||
exists(AbstractValue value |
|
||||
guard.comparesLt(left, k, true, value) and op = " < "
|
||||
or
|
||||
guard.comparesLt(left, right, k, false, sense) and op = " >= "
|
||||
guard.comparesLt(left, k, false, value) and op = " >= "
|
||||
or
|
||||
guard.comparesEq(left, right, k, true, sense) and op = " == "
|
||||
guard.comparesEq(left, k, true, value) and op = " == "
|
||||
or
|
||||
guard.comparesEq(left, right, k, false, sense) and op = " != "
|
||||
) and
|
||||
startLine = guard.getLocation().getStartLine() and
|
||||
msg =
|
||||
left.getAnyDef().getUnconvertedResultExpression() + op +
|
||||
right.getAnyDef().getUnconvertedResultExpression() + "+" + k + " when " + guard + " is " +
|
||||
which
|
||||
guard.comparesEq(left, k, false, value) and op = " != "
|
||||
|
|
||||
msg =
|
||||
left.getAnyDef().getUnconvertedResultExpression() + op + k + " when " + guard + " is " +
|
||||
value
|
||||
)
|
||||
|
|
||||
startLine = guard.getLocation().getStartLine()
|
||||
)
|
||||
}
|
||||
|
||||
@@ -95,3 +137,20 @@ query predicate irGuardsEnsure(
|
||||
block.getLocation().hasLocationInfo(_, start, _, end, _)
|
||||
)
|
||||
}
|
||||
|
||||
query predicate irGuardsEnsure_const(
|
||||
IRGuardCondition guard, Instruction left, string op, int k, int start, int end
|
||||
) {
|
||||
exists(IRBlock block, Operand leftOp |
|
||||
guard.ensuresLt(leftOp, k, block, true) and op = "<"
|
||||
or
|
||||
guard.ensuresLt(leftOp, k, block, false) and op = ">="
|
||||
or
|
||||
guard.ensuresEq(leftOp, k, block, true) and op = "=="
|
||||
or
|
||||
guard.ensuresEq(leftOp, k, block, false) and op = "!="
|
||||
|
|
||||
leftOp = left.getAUse() and
|
||||
block.getLocation().hasLocationInfo(_, start, _, end, _)
|
||||
)
|
||||
}
|
||||
|
||||
@@ -29,3 +29,6 @@
|
||||
| test.cpp:18:8:18:10 | call to get |
|
||||
| test.cpp:31:7:31:13 | ... == ... |
|
||||
| test.cpp:42:13:42:20 | call to getABool |
|
||||
| test.cpp:61:10:61:10 | i |
|
||||
| test.cpp:74:10:74:10 | i |
|
||||
| test.cpp:84:10:84:10 | i |
|
||||
|
||||
@@ -1,58 +1,93 @@
|
||||
| 7 | 0 < x+0 when ... > ... is true |
|
||||
| 7 | 0 >= x+0 when ... > ... is false |
|
||||
| 7 | x < 0+1 when ... > ... is false |
|
||||
| 7 | x < 1 when ... > ... is false |
|
||||
| 7 | x >= 0+1 when ... > ... is true |
|
||||
| 7 | x >= 1 when ... > ... is true |
|
||||
| 17 | 0 < x+1 when ... < ... is false |
|
||||
| 17 | 0 >= x+1 when ... && ... is true |
|
||||
| 17 | 0 >= x+1 when ... < ... is true |
|
||||
| 17 | 1 < y+0 when ... && ... is true |
|
||||
| 17 | 1 < y+0 when ... > ... is true |
|
||||
| 17 | 1 >= y+0 when ... > ... is false |
|
||||
| 17 | x < 0 when ... && ... is true |
|
||||
| 17 | x < 0 when ... < ... is true |
|
||||
| 17 | x < 0+0 when ... && ... is true |
|
||||
| 17 | x < 0+0 when ... < ... is true |
|
||||
| 17 | x >= 0 when ... < ... is false |
|
||||
| 17 | x >= 0+0 when ... < ... is false |
|
||||
| 17 | y < 1+1 when ... > ... is false |
|
||||
| 17 | y < 2 when ... > ... is false |
|
||||
| 17 | y >= 1+1 when ... && ... is true |
|
||||
| 17 | y >= 1+1 when ... > ... is true |
|
||||
| 17 | y >= 2 when ... && ... is true |
|
||||
| 17 | y >= 2 when ... > ... is true |
|
||||
| 26 | 0 < x+0 when ... > ... is true |
|
||||
| 26 | 0 >= x+0 when ... > ... is false |
|
||||
| 26 | x < 0+1 when ... > ... is false |
|
||||
| 26 | x < 1 when ... > ... is false |
|
||||
| 26 | x >= 0+1 when ... > ... is true |
|
||||
| 26 | x >= 1 when ... > ... is true |
|
||||
| 31 | - ... != x+0 when ... == ... is false |
|
||||
| 31 | - ... == x+0 when ... == ... is true |
|
||||
| 31 | x != -1 when ... == ... is false |
|
||||
| 31 | x != - ...+0 when ... == ... is false |
|
||||
| 31 | x == -1 when ... == ... is true |
|
||||
| 31 | x == - ...+0 when ... == ... is true |
|
||||
| 34 | 10 < j+1 when ... < ... is false |
|
||||
| 34 | 10 >= j+1 when ... < ... is true |
|
||||
| 34 | j < 10 when ... < ... is true |
|
||||
| 34 | j < 10+0 when ... < ... is true |
|
||||
| 34 | j >= 10 when ... < ... is false |
|
||||
| 34 | j >= 10+0 when ... < ... is false |
|
||||
| 42 | 10 < j+1 when ... < ... is false |
|
||||
| 42 | 10 >= j+1 when ... < ... is true |
|
||||
| 42 | j < 10 when ... < ... is true |
|
||||
| 42 | j < 10+0 when ... < ... is true |
|
||||
| 42 | j >= 10 when ... < ... is false |
|
||||
| 42 | j >= 10+0 when ... < ... is false |
|
||||
| 44 | 0 < z+0 when ... > ... is true |
|
||||
| 44 | 0 >= z+0 when ... > ... is false |
|
||||
| 44 | z < 0+1 when ... > ... is false |
|
||||
| 44 | z < 1 when ... > ... is false |
|
||||
| 44 | z >= 0+1 when ... > ... is true |
|
||||
| 44 | z >= 1 when ... > ... is true |
|
||||
| 45 | 0 < y+0 when ... > ... is true |
|
||||
| 45 | 0 >= y+0 when ... > ... is false |
|
||||
| 45 | y < 0+1 when ... > ... is false |
|
||||
| 45 | y < 1 when ... > ... is false |
|
||||
| 45 | y >= 0+1 when ... > ... is true |
|
||||
| 45 | y >= 1 when ... > ... is true |
|
||||
| 58 | 0 != x+0 when ... == ... is false |
|
||||
| 58 | 0 != x+0 when ... \|\| ... is false |
|
||||
| 58 | 0 < y+1 when ... < ... is false |
|
||||
| 58 | 0 < y+1 when ... \|\| ... is false |
|
||||
| 58 | 0 == x+0 when ... == ... is true |
|
||||
| 58 | 0 >= y+1 when ... < ... is true |
|
||||
| 58 | x != 0 when ... == ... is false |
|
||||
| 58 | x != 0 when ... \|\| ... is false |
|
||||
| 58 | x != 0+0 when ... == ... is false |
|
||||
| 58 | x != 0+0 when ... \|\| ... is false |
|
||||
| 58 | x == 0 when ... == ... is true |
|
||||
| 58 | x == 0+0 when ... == ... is true |
|
||||
| 58 | y < 0 when ... < ... is true |
|
||||
| 58 | y < 0+0 when ... < ... is true |
|
||||
| 58 | y >= 0 when ... < ... is false |
|
||||
| 58 | y >= 0 when ... \|\| ... is false |
|
||||
| 58 | y >= 0+0 when ... < ... is false |
|
||||
| 58 | y >= 0+0 when ... \|\| ... is false |
|
||||
| 61 | i == 0 when i is Case[0] |
|
||||
| 61 | i == 1 when i is Case[1] |
|
||||
| 61 | i == 2 when i is Case[2] |
|
||||
| 74 | i < 11 when i is Case[0..10] |
|
||||
| 74 | i < 21 when i is Case[11..20] |
|
||||
| 74 | i >= 0 when i is Case[0..10] |
|
||||
| 74 | i >= 11 when i is Case[11..20] |
|
||||
| 75 | 0 != x+0 when ... == ... is false |
|
||||
| 75 | 0 == x+0 when ... == ... is true |
|
||||
| 75 | x != 0 when ... == ... is false |
|
||||
| 75 | x != 0+0 when ... == ... is false |
|
||||
| 75 | x == 0 when ... == ... is true |
|
||||
| 75 | x == 0+0 when ... == ... is true |
|
||||
| 85 | 0 != x+0 when ... == ... is false |
|
||||
| 85 | 0 != y+0 when ... != ... is true |
|
||||
@@ -60,19 +95,29 @@
|
||||
| 85 | 0 == x+0 when ... && ... is true |
|
||||
| 85 | 0 == x+0 when ... == ... is true |
|
||||
| 85 | 0 == y+0 when ... != ... is false |
|
||||
| 85 | x != 0 when ... == ... is false |
|
||||
| 85 | x != 0+0 when ... == ... is false |
|
||||
| 85 | x == 0 when ... && ... is true |
|
||||
| 85 | x == 0 when ... == ... is true |
|
||||
| 85 | x == 0+0 when ... && ... is true |
|
||||
| 85 | x == 0+0 when ... == ... is true |
|
||||
| 85 | y != 0 when ... != ... is true |
|
||||
| 85 | y != 0 when ... && ... is true |
|
||||
| 85 | y != 0+0 when ... != ... is true |
|
||||
| 85 | y != 0+0 when ... && ... is true |
|
||||
| 85 | y == 0 when ... != ... is false |
|
||||
| 85 | y == 0+0 when ... != ... is false |
|
||||
| 94 | 0 != x+0 when ... != ... is true |
|
||||
| 94 | 0 == x+0 when ... != ... is false |
|
||||
| 94 | x != 0 when ... != ... is true |
|
||||
| 94 | x != 0+0 when ... != ... is true |
|
||||
| 94 | x == 0 when ... != ... is false |
|
||||
| 94 | x == 0+0 when ... != ... is false |
|
||||
| 102 | 10 < j+1 when ... < ... is false |
|
||||
| 102 | 10 >= j+1 when ... < ... is true |
|
||||
| 102 | j < 10 when ... < ... is true |
|
||||
| 102 | j < 10+0 when ... < ... is true |
|
||||
| 102 | j >= 10 when ... < ... is false |
|
||||
| 102 | j >= 10+0 when ... < ... is false |
|
||||
| 109 | 0 != x+0 when ... == ... is false |
|
||||
| 109 | 0 != x+0 when ... \|\| ... is false |
|
||||
@@ -80,9 +125,15 @@
|
||||
| 109 | 0 < y+1 when ... \|\| ... is false |
|
||||
| 109 | 0 == x+0 when ... == ... is true |
|
||||
| 109 | 0 >= y+1 when ... < ... is true |
|
||||
| 109 | x != 0 when ... == ... is false |
|
||||
| 109 | x != 0 when ... \|\| ... is false |
|
||||
| 109 | x != 0+0 when ... == ... is false |
|
||||
| 109 | x != 0+0 when ... \|\| ... is false |
|
||||
| 109 | x == 0 when ... == ... is true |
|
||||
| 109 | x == 0+0 when ... == ... is true |
|
||||
| 109 | y < 0 when ... < ... is true |
|
||||
| 109 | y < 0+0 when ... < ... is true |
|
||||
| 109 | y >= 0 when ... < ... is false |
|
||||
| 109 | y >= 0 when ... \|\| ... is false |
|
||||
| 109 | y >= 0+0 when ... < ... is false |
|
||||
| 109 | y >= 0+0 when ... \|\| ... is false |
|
||||
|
||||
@@ -7,20 +7,35 @@
|
||||
import cpp
|
||||
import semmle.code.cpp.controlflow.Guards
|
||||
|
||||
from GuardCondition guard, Expr left, Expr right, int k, string which, string op, string msg
|
||||
from GuardCondition guard, Expr left, int k, string op, string msg
|
||||
where
|
||||
exists(boolean sense |
|
||||
exists(boolean sense, string which |
|
||||
sense = true and which = "true"
|
||||
or
|
||||
sense = false and which = "false"
|
||||
|
|
||||
guard.comparesLt(left, right, k, true, sense) and op = " < "
|
||||
exists(Expr right |
|
||||
guard.comparesLt(left, right, k, true, sense) and op = " < "
|
||||
or
|
||||
guard.comparesLt(left, right, k, false, sense) and op = " >= "
|
||||
or
|
||||
guard.comparesEq(left, right, k, true, sense) and op = " == "
|
||||
or
|
||||
guard.comparesEq(left, right, k, false, sense) and op = " != "
|
||||
|
|
||||
msg = left + op + right + "+" + k + " when " + guard + " is " + which
|
||||
)
|
||||
)
|
||||
or
|
||||
exists(AbstractValue value |
|
||||
guard.comparesLt(left, k, true, value) and op = " < "
|
||||
or
|
||||
guard.comparesLt(left, right, k, false, sense) and op = " >= "
|
||||
guard.comparesLt(left, k, false, value) and op = " >= "
|
||||
or
|
||||
guard.comparesEq(left, right, k, true, sense) and op = " == "
|
||||
guard.comparesEq(left, k, true, value) and op = " == "
|
||||
or
|
||||
guard.comparesEq(left, right, k, false, sense) and op = " != "
|
||||
) and
|
||||
msg = left + op + right + "+" + k + " when " + guard + " is " + which
|
||||
guard.comparesEq(left, k, false, value) and op = " != "
|
||||
|
|
||||
msg = left + op + k + " when " + guard + " is " + value
|
||||
)
|
||||
select guard.getLocation().getStartLine(), msg
|
||||
|
||||
@@ -86,3 +86,7 @@
|
||||
| test.cpp:31:7:31:13 | ... == ... | true | 31 | 32 |
|
||||
| test.cpp:42:13:42:20 | call to getABool | false | 53 | 53 |
|
||||
| test.cpp:42:13:42:20 | call to getABool | true | 43 | 45 |
|
||||
| test.cpp:61:10:61:10 | i | Case[0] | 62 | 64 |
|
||||
| test.cpp:61:10:61:10 | i | Case[1] | 65 | 66 |
|
||||
| test.cpp:74:10:74:10 | i | Case[0..10] | 75 | 77 |
|
||||
| test.cpp:74:10:74:10 | i | Case[11..20] | 78 | 79 |
|
||||
|
||||
@@ -7,10 +7,10 @@
|
||||
import cpp
|
||||
import semmle.code.cpp.controlflow.Guards
|
||||
|
||||
from GuardCondition guard, boolean sense, int start, int end
|
||||
from GuardCondition guard, AbstractValue value, int start, int end
|
||||
where
|
||||
exists(BasicBlock block |
|
||||
guard.controls(block, sense) and
|
||||
guard.valueControls(block, value) and
|
||||
block.hasLocationInfo(_, start, _, end, _)
|
||||
)
|
||||
select guard, sense, start, end
|
||||
select guard, value, start, end
|
||||
|
||||
@@ -52,3 +52,37 @@ bool testWithCatch0(int v)
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void use1(int);
|
||||
void use2(int);
|
||||
void use3(int);
|
||||
|
||||
void test_switches_simple(int i) {
|
||||
switch(i) {
|
||||
case 0:
|
||||
use1(i);
|
||||
break;
|
||||
case 1:
|
||||
use2(i);
|
||||
/* NOTE: fallthrough */
|
||||
case 2:
|
||||
use3(i);
|
||||
}
|
||||
}
|
||||
|
||||
void test_switches_range(int i) {
|
||||
switch(i) {
|
||||
case 0 ... 10:
|
||||
use1(i);
|
||||
break;
|
||||
case 11 ... 20:
|
||||
use2(i);
|
||||
}
|
||||
}
|
||||
|
||||
void test_switches_default(int i) {
|
||||
switch(i) {
|
||||
default:
|
||||
use1(i);
|
||||
}
|
||||
}
|
||||
@@ -6676,6 +6676,7 @@ WARNING: Module TaintTracking has been deprecated and may be removed in future (
|
||||
| taint.cpp:757:7:757:10 | path | taint.cpp:759:8:759:11 | path | |
|
||||
| taint.cpp:758:21:758:24 | ref arg path | taint.cpp:759:8:759:11 | path | |
|
||||
| taint.cpp:759:8:759:11 | path | taint.cpp:759:7:759:11 | * ... | |
|
||||
| taint.cpp:769:37:769:42 | call to source | taint.cpp:770:7:770:9 | obj | |
|
||||
| vector.cpp:16:43:16:49 | source1 | vector.cpp:17:26:17:32 | source1 | |
|
||||
| vector.cpp:16:43:16:49 | source1 | vector.cpp:31:38:31:44 | source1 | |
|
||||
| vector.cpp:17:21:17:33 | call to vector | vector.cpp:19:14:19:14 | v | |
|
||||
|
||||
@@ -757,4 +757,15 @@ void test_call_sprintf() {
|
||||
char path[10];
|
||||
call_sprintf_twice(path, indirect_source());
|
||||
sink(*path); // $ ast,ir
|
||||
}
|
||||
|
||||
struct TaintInheritingContentObject {
|
||||
int flowFromObject;
|
||||
};
|
||||
|
||||
TaintInheritingContentObject source(bool);
|
||||
|
||||
void test_TaintInheritingContent() {
|
||||
TaintInheritingContentObject obj = source(true);
|
||||
sink(obj.flowFromObject); // $ ir MISSING: ast
|
||||
}
|
||||
@@ -76,6 +76,24 @@ module AstTest {
|
||||
module IRTest {
|
||||
private import semmle.code.cpp.ir.IR
|
||||
private import semmle.code.cpp.ir.dataflow.TaintTracking
|
||||
private import semmle.code.cpp.ir.dataflow.FlowSteps
|
||||
|
||||
/**
|
||||
* Object->field flow when the object is of type
|
||||
* TaintInheritingContentObject and the field is named
|
||||
* flowFromObject
|
||||
*/
|
||||
class TaintInheritingContentTest extends TaintInheritingContent, DataFlow::FieldContent {
|
||||
TaintInheritingContentTest() {
|
||||
exists(Struct o, Field f |
|
||||
this.getField() = f and
|
||||
f = o.getAField() and
|
||||
o.hasGlobalName("TaintInheritingContentObject") and
|
||||
f.hasName("flowFromObject") and
|
||||
this.getIndirectionIndex() = 1
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
/** Common data flow configuration to be used by tests. */
|
||||
module TestAllocationConfig implements DataFlow::ConfigSig {
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1055,28 +1055,75 @@ void Lambda(int x, const String& s) {
|
||||
lambda_inits(6);
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
struct vector {
|
||||
struct iterator {
|
||||
T* p;
|
||||
iterator& operator++();
|
||||
T& operator*() const;
|
||||
namespace std {
|
||||
template<class T>
|
||||
struct remove_const { typedef T type; };
|
||||
|
||||
bool operator!=(iterator right) const;
|
||||
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;
|
||||
|
||||
struct ptrdiff_t;
|
||||
|
||||
template<class I> struct iterator_traits;
|
||||
|
||||
template <class Category,
|
||||
class value_type,
|
||||
class difference_type = ptrdiff_t,
|
||||
class pointer_type = value_type*,
|
||||
class reference_type = value_type&>
|
||||
struct iterator {
|
||||
typedef Category iterator_category;
|
||||
|
||||
iterator();
|
||||
iterator(iterator<Category, remove_const_t<value_type> > const &other); // non-const -> const conversion constructor
|
||||
|
||||
iterator &operator++();
|
||||
iterator operator++(int);
|
||||
iterator &operator--();
|
||||
iterator operator--(int);
|
||||
bool operator==(iterator other) const;
|
||||
bool operator!=(iterator other) const;
|
||||
reference_type operator*() const;
|
||||
pointer_type operator->() const;
|
||||
iterator operator+(int);
|
||||
iterator operator-(int);
|
||||
iterator &operator+=(int);
|
||||
iterator &operator-=(int);
|
||||
int operator-(iterator);
|
||||
reference_type operator[](int);
|
||||
};
|
||||
|
||||
vector(T);
|
||||
~vector();
|
||||
iterator begin() const;
|
||||
iterator end() const;
|
||||
};
|
||||
struct input_iterator_tag {};
|
||||
struct forward_iterator_tag : public input_iterator_tag {};
|
||||
struct bidirectional_iterator_tag : public forward_iterator_tag {};
|
||||
struct random_access_iterator_tag : public bidirectional_iterator_tag {};
|
||||
|
||||
template<typename T>
|
||||
bool operator==(typename vector<T>::iterator left, typename vector<T>::iterator right);
|
||||
template<typename T>
|
||||
bool operator!=(typename vector<T>::iterator left, typename vector<T>::iterator right);
|
||||
struct output_iterator_tag {};
|
||||
|
||||
void RangeBasedFor(const vector<int>& v) {
|
||||
template<typename T>
|
||||
struct vector {
|
||||
vector(T);
|
||||
~vector();
|
||||
|
||||
using iterator = std::iterator<random_access_iterator_tag, T>;
|
||||
using const_iterator = std::iterator<random_access_iterator_tag, const T>;
|
||||
|
||||
iterator begin() const;
|
||||
iterator end() const;
|
||||
};
|
||||
|
||||
template<typename T>
|
||||
bool operator==(typename vector<T>::iterator left, typename vector<T>::iterator right);
|
||||
template<typename T>
|
||||
bool operator!=(typename vector<T>::iterator left, typename vector<T>::iterator right);
|
||||
|
||||
}
|
||||
|
||||
void RangeBasedFor(const std::vector<int>& v) {
|
||||
for (int e : v) {
|
||||
if (e > 0) {
|
||||
continue;
|
||||
@@ -2151,21 +2198,21 @@ void initialization_with_destructor(bool b, char c) {
|
||||
}
|
||||
|
||||
ClassWithDestructor x;
|
||||
for(vector<ClassWithDestructor> ys(x); ClassWithDestructor y : ys)
|
||||
for(std::vector<ClassWithDestructor> ys(x); ClassWithDestructor y : ys)
|
||||
y.set_x('a');
|
||||
|
||||
for(vector<ClassWithDestructor> ys(x); ClassWithDestructor y : ys) {
|
||||
for(std::vector<ClassWithDestructor> ys(x); ClassWithDestructor y : ys) {
|
||||
y.set_x('a');
|
||||
if (y.get_x() == 'b')
|
||||
return;
|
||||
}
|
||||
|
||||
for(vector<int> ys(1); int y : ys) {
|
||||
for(std::vector<int> ys(1); int y : ys) {
|
||||
if (y == 1)
|
||||
return;
|
||||
}
|
||||
|
||||
for(vector<ClassWithDestructor> ys(x); ClassWithDestructor y : ys) {
|
||||
for(std::vector<ClassWithDestructor> ys(x); ClassWithDestructor y : ys) {
|
||||
ClassWithDestructor z1;
|
||||
ClassWithDestructor z2;
|
||||
}
|
||||
@@ -2243,7 +2290,7 @@ void ForDestructors() {
|
||||
String s2;
|
||||
}
|
||||
|
||||
for(String s : vector<String>(String("hello"))) {
|
||||
for(String s : std::vector<String>(String("hello"))) {
|
||||
String s2;
|
||||
}
|
||||
|
||||
@@ -2331,4 +2378,43 @@ namespace return_routine_type {
|
||||
|
||||
}
|
||||
|
||||
int small_operation_should_not_be_constant_folded() {
|
||||
return 1 ^ 2;
|
||||
}
|
||||
|
||||
#define BINOP2(x) (x ^ x)
|
||||
#define BINOP4(x) (BINOP2(x) ^ BINOP2(x))
|
||||
#define BINOP8(x) (BINOP4(x) ^ BINOP4(x))
|
||||
#define BINOP16(x) (BINOP8(x) ^ BINOP8(x))
|
||||
#define BINOP32(x) (BINOP16(x) ^ BINOP16(x))
|
||||
#define BINOP64(x) (BINOP32(x) ^ BINOP32(x))
|
||||
|
||||
int large_operation_should_be_constant_folded() {
|
||||
return BINOP64(1);
|
||||
}
|
||||
|
||||
void initialization_with_temp_destructor() {
|
||||
if (char x = ClassWithDestructor().get_x())
|
||||
x++;
|
||||
|
||||
if (char x = ClassWithDestructor().get_x(); x)
|
||||
x++;
|
||||
|
||||
if constexpr (char x = ClassWithDestructor().get_x(); initialization_with_destructor_bool)
|
||||
x++;
|
||||
|
||||
switch(char x = ClassWithDestructor().get_x()) {
|
||||
case 'a':
|
||||
x++;
|
||||
}
|
||||
|
||||
switch(char x = ClassWithDestructor().get_x(); x) {
|
||||
case 'a':
|
||||
x++;
|
||||
}
|
||||
|
||||
for(char x = ClassWithDestructor().get_x(); char y : std::vector<char>(x))
|
||||
y += x;
|
||||
}
|
||||
|
||||
// semmle-extractor-options: -std=c++20 --clang
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -20,7 +20,7 @@ multipleIRTypes
|
||||
lostReachability
|
||||
backEdgeCountMismatch
|
||||
useNotDominatedByDefinition
|
||||
| ir.cpp:1488:8:1488:8 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | ir.cpp:1488:8:1488:8 | void StructuredBindingDataMemberStruct::StructuredBindingDataMemberStruct() | void StructuredBindingDataMemberStruct::StructuredBindingDataMemberStruct() |
|
||||
| ir.cpp:1535:8:1535:8 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | ir.cpp:1535:8:1535:8 | void StructuredBindingDataMemberStruct::StructuredBindingDataMemberStruct() | void StructuredBindingDataMemberStruct::StructuredBindingDataMemberStruct() |
|
||||
| try_except.c:13:13:13:13 | Left | Operand 'Left' is not dominated by its definition in function '$@'. | try_except.c:6:6:6:6 | void f() | void f() |
|
||||
| try_except.c:13:13:13:13 | Left | Operand 'Left' is not dominated by its definition in function '$@'. | try_except.c:6:6:6:6 | void f() | void f() |
|
||||
| try_except.c:39:15:39:15 | Left | Operand 'Left' is not dominated by its definition in function '$@'. | try_except.c:32:6:32:6 | void h(int) | void h(int) |
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -41,16 +41,16 @@ nodes
|
||||
| test_free.cpp:302:12:302:14 | buf | semmle.label | buf |
|
||||
subpaths
|
||||
#select
|
||||
| test_free.cpp:14:10:14:10 | a | test_free.cpp:11:10:11:10 | pointer to free output argument | test_free.cpp:14:10:14:10 | a | Memory pointed to by 'a' may already have been freed by $@. | test_free.cpp:11:5:11:8 | call to free | call to free |
|
||||
| test_free.cpp:31:27:31:27 | a | test_free.cpp:30:10:30:10 | pointer to free output argument | test_free.cpp:31:27:31:27 | a | Memory pointed to by 'a' may already have been freed by $@. | test_free.cpp:30:5:30:8 | call to free | call to free |
|
||||
| test_free.cpp:37:27:37:27 | a | test_free.cpp:35:10:35:10 | pointer to free output argument | test_free.cpp:37:27:37:27 | a | Memory pointed to by 'a' may already have been freed by $@. | test_free.cpp:35:5:35:8 | call to free | call to free |
|
||||
| test_free.cpp:46:10:46:10 | a | test_free.cpp:42:27:42:27 | pointer to free output argument | test_free.cpp:46:10:46:10 | a | Memory pointed to by 'a' may already have been freed by $@. | test_free.cpp:42:22:42:25 | call to free | call to free |
|
||||
| test_free.cpp:46:10:46:10 | a | test_free.cpp:44:27:44:27 | pointer to free output argument | test_free.cpp:46:10:46:10 | a | Memory pointed to by 'a' may already have been freed by $@. | test_free.cpp:44:22:44:25 | call to free | call to free |
|
||||
| test_free.cpp:51:10:51:10 | a | test_free.cpp:50:27:50:27 | pointer to free output argument | test_free.cpp:51:10:51:10 | a | Memory pointed to by 'a' may already have been freed by $@. | test_free.cpp:50:22:50:25 | call to free | call to free |
|
||||
| test_free.cpp:72:14:72:14 | a | test_free.cpp:69:10:69:10 | pointer to free output argument | test_free.cpp:72:14:72:14 | a | Memory pointed to by 'a' may already have been freed by $@. | test_free.cpp:69:5:69:8 | call to free | call to free |
|
||||
| test_free.cpp:85:12:85:12 | a | test_free.cpp:83:12:83:12 | pointer to operator delete output argument | test_free.cpp:85:12:85:12 | a | Memory pointed to by 'a' may already have been freed by $@. | test_free.cpp:83:5:83:13 | delete | delete |
|
||||
| test_free.cpp:103:10:103:10 | a | test_free.cpp:101:10:101:10 | pointer to free output argument | test_free.cpp:103:10:103:10 | a | Memory pointed to by 'a' may already have been freed by $@. | test_free.cpp:101:5:101:8 | call to free | call to free |
|
||||
| test_free.cpp:129:10:129:11 | * ... | test_free.cpp:128:10:128:11 | pointer to free output argument | test_free.cpp:129:10:129:11 | * ... | Memory pointed to by '* ...' may already have been freed by $@. | test_free.cpp:128:5:128:8 | call to free | call to free |
|
||||
| test_free.cpp:154:10:154:10 | a | test_free.cpp:152:27:152:27 | pointer to free output argument | test_free.cpp:154:10:154:10 | a | Memory pointed to by 'a' may already have been freed by $@. | test_free.cpp:152:22:152:25 | call to free | call to free |
|
||||
| test_free.cpp:209:10:209:10 | a | test_free.cpp:207:10:207:10 | pointer to free output argument | test_free.cpp:209:10:209:10 | a | Memory pointed to by 'a' may already have been freed by $@. | test_free.cpp:207:5:207:8 | call to free | call to free |
|
||||
| test_free.cpp:302:12:302:14 | buf | test_free.cpp:301:12:301:14 | pointer to g_free output argument | test_free.cpp:302:12:302:14 | buf | Memory pointed to by 'buf' may already have been freed by $@. | test_free.cpp:301:5:301:10 | call to g_free | call to g_free |
|
||||
| test_free.cpp:14:10:14:10 | a | test_free.cpp:11:10:11:10 | pointer to free output argument | test_free.cpp:14:10:14:10 | a | Memory pointed to by $@ may already have been freed by $@. | test_free.cpp:14:10:14:10 | a | a | test_free.cpp:11:5:11:8 | call to free | call to free |
|
||||
| test_free.cpp:31:27:31:27 | a | test_free.cpp:30:10:30:10 | pointer to free output argument | test_free.cpp:31:27:31:27 | a | Memory pointed to by $@ may already have been freed by $@. | test_free.cpp:31:27:31:27 | a | a | test_free.cpp:30:5:30:8 | call to free | call to free |
|
||||
| test_free.cpp:37:27:37:27 | a | test_free.cpp:35:10:35:10 | pointer to free output argument | test_free.cpp:37:27:37:27 | a | Memory pointed to by $@ may already have been freed by $@. | test_free.cpp:37:27:37:27 | a | a | test_free.cpp:35:5:35:8 | call to free | call to free |
|
||||
| test_free.cpp:46:10:46:10 | a | test_free.cpp:42:27:42:27 | pointer to free output argument | test_free.cpp:46:10:46:10 | a | Memory pointed to by $@ may already have been freed by $@. | test_free.cpp:46:10:46:10 | a | a | test_free.cpp:42:22:42:25 | call to free | call to free |
|
||||
| test_free.cpp:46:10:46:10 | a | test_free.cpp:44:27:44:27 | pointer to free output argument | test_free.cpp:46:10:46:10 | a | Memory pointed to by $@ may already have been freed by $@. | test_free.cpp:46:10:46:10 | a | a | test_free.cpp:44:22:44:25 | call to free | call to free |
|
||||
| test_free.cpp:51:10:51:10 | a | test_free.cpp:50:27:50:27 | pointer to free output argument | test_free.cpp:51:10:51:10 | a | Memory pointed to by $@ may already have been freed by $@. | test_free.cpp:51:10:51:10 | a | a | test_free.cpp:50:22:50:25 | call to free | call to free |
|
||||
| test_free.cpp:72:14:72:14 | a | test_free.cpp:69:10:69:10 | pointer to free output argument | test_free.cpp:72:14:72:14 | a | Memory pointed to by $@ may already have been freed by $@. | test_free.cpp:72:14:72:14 | a | a | test_free.cpp:69:5:69:8 | call to free | call to free |
|
||||
| test_free.cpp:85:12:85:12 | a | test_free.cpp:83:12:83:12 | pointer to operator delete output argument | test_free.cpp:85:12:85:12 | a | Memory pointed to by $@ may already have been freed by $@. | test_free.cpp:85:12:85:12 | a | a | test_free.cpp:83:5:83:13 | delete | delete |
|
||||
| test_free.cpp:103:10:103:10 | a | test_free.cpp:101:10:101:10 | pointer to free output argument | test_free.cpp:103:10:103:10 | a | Memory pointed to by $@ may already have been freed by $@. | test_free.cpp:103:10:103:10 | a | a | test_free.cpp:101:5:101:8 | call to free | call to free |
|
||||
| test_free.cpp:129:10:129:11 | * ... | test_free.cpp:128:10:128:11 | pointer to free output argument | test_free.cpp:129:10:129:11 | * ... | Memory pointed to by $@ may already have been freed by $@. | test_free.cpp:129:10:129:11 | * ... | * ... | test_free.cpp:128:5:128:8 | call to free | call to free |
|
||||
| test_free.cpp:154:10:154:10 | a | test_free.cpp:152:27:152:27 | pointer to free output argument | test_free.cpp:154:10:154:10 | a | Memory pointed to by $@ may already have been freed by $@. | test_free.cpp:154:10:154:10 | a | a | test_free.cpp:152:22:152:25 | call to free | call to free |
|
||||
| test_free.cpp:209:10:209:10 | a | test_free.cpp:207:10:207:10 | pointer to free output argument | test_free.cpp:209:10:209:10 | a | Memory pointed to by $@ may already have been freed by $@. | test_free.cpp:209:10:209:10 | a | a | test_free.cpp:207:5:207:8 | call to free | call to free |
|
||||
| test_free.cpp:302:12:302:14 | buf | test_free.cpp:301:12:301:14 | pointer to g_free output argument | test_free.cpp:302:12:302:14 | buf | Memory pointed to by $@ may already have been freed by $@. | test_free.cpp:302:12:302:14 | buf | buf | test_free.cpp:301:5:301:10 | call to g_free | call to g_free |
|
||||
|
||||
@@ -1,18 +1,136 @@
|
||||
| test.cpp:35:7:35:7 | i | This variable is read, but may not have been written. It should be guarded by a check that the $@ returns at least 1. | test.cpp:34:3:34:7 | call to scanf | call to scanf |
|
||||
| test.cpp:68:7:68:7 | i | This variable is read, but may not have been written. It should be guarded by a check that the $@ returns at least 1. | test.cpp:67:3:67:7 | call to scanf | call to scanf |
|
||||
| test.cpp:80:7:80:7 | i | This variable is read, but may not have been written. It should be guarded by a check that the $@ returns at least 1. | test.cpp:79:3:79:7 | call to scanf | call to scanf |
|
||||
| test.cpp:90:7:90:8 | * ... | This variable is read, but may not have been written. It should be guarded by a check that the $@ returns at least 1. | test.cpp:89:3:89:7 | call to scanf | call to scanf |
|
||||
| test.cpp:98:7:98:8 | * ... | This variable is read, but may not have been written. It should be guarded by a check that the $@ returns at least 1. | test.cpp:97:3:97:7 | call to scanf | call to scanf |
|
||||
| test.cpp:108:7:108:7 | i | This variable is read, but may not have been written. It should be guarded by a check that the $@ returns at least 1. | test.cpp:107:3:107:8 | call to fscanf | call to fscanf |
|
||||
| test.cpp:115:7:115:7 | i | This variable is read, but may not have been written. It should be guarded by a check that the $@ returns at least 1. | test.cpp:114:3:114:8 | call to sscanf | call to sscanf |
|
||||
| test.cpp:224:8:224:8 | j | This variable is read, but may not have been written. It should be guarded by a check that the $@ returns at least 2. | test.cpp:221:7:221:11 | call to scanf | call to scanf |
|
||||
| test.cpp:248:9:248:9 | d | This variable is read, but may not have been written. It should be guarded by a check that the $@ returns at least 2. | test.cpp:246:25:246:29 | call to scanf | call to scanf |
|
||||
| test.cpp:252:9:252:9 | d | This variable is read, but may not have been written. It should be guarded by a check that the $@ returns at least 2. | test.cpp:250:14:250:18 | call to scanf | call to scanf |
|
||||
| test.cpp:272:7:272:7 | i | This variable is read, but may not have been written. It should be guarded by a check that the $@ returns at least 1. | test.cpp:271:3:271:7 | call to scanf | call to scanf |
|
||||
| test.cpp:280:7:280:7 | i | This variable is read, but may not have been written. It should be guarded by a check that the $@ returns at least 1. | test.cpp:279:3:279:7 | call to scanf | call to scanf |
|
||||
| test.cpp:292:7:292:7 | i | This variable is read, but may not have been written. It should be guarded by a check that the $@ returns at least 1. | test.cpp:291:3:291:7 | call to scanf | call to scanf |
|
||||
| test.cpp:404:25:404:25 | u | This variable is read, but may not have been written. It should be guarded by a check that the $@ returns at least 1. | test.cpp:403:6:403:11 | call to sscanf | call to sscanf |
|
||||
| test.cpp:416:7:416:7 | i | This variable is read, but may not have been written. It should be guarded by a check that the $@ returns at least 1. | test.cpp:413:7:413:11 | call to scanf | call to scanf |
|
||||
| test.cpp:423:7:423:7 | i | This variable is read, but may not have been written. It should be guarded by a check that the $@ returns at least 1. | test.cpp:420:7:420:11 | call to scanf | call to scanf |
|
||||
| test.cpp:460:6:460:10 | value | This variable is read, but may not have been written. It should be guarded by a check that the $@ returns at least 1. | test.cpp:455:12:455:17 | call to sscanf | call to sscanf |
|
||||
| test.cpp:474:6:474:10 | value | This variable is read, but may not have been written. It should be guarded by a check that the $@ returns at least 1. | test.cpp:467:8:467:12 | call to scanf | call to scanf |
|
||||
edges
|
||||
| test.cpp:34:15:34:16 | scanf output argument | test.cpp:35:7:35:7 | i | provenance | |
|
||||
| test.cpp:41:19:41:20 | scanf output argument | test.cpp:43:8:43:8 | i | provenance | |
|
||||
| test.cpp:58:19:58:20 | scanf output argument | test.cpp:60:8:60:8 | i | provenance | |
|
||||
| test.cpp:67:15:67:16 | scanf output argument | test.cpp:68:7:68:7 | i | provenance | |
|
||||
| test.cpp:70:19:70:20 | scanf output argument | test.cpp:72:8:72:8 | i | provenance | |
|
||||
| test.cpp:79:15:79:16 | scanf output argument | test.cpp:80:7:80:7 | i | provenance | |
|
||||
| test.cpp:89:15:89:15 | scanf output argument | test.cpp:90:7:90:8 | * ... | provenance | |
|
||||
| test.cpp:97:15:97:15 | scanf output argument | test.cpp:98:7:98:8 | * ... | provenance | |
|
||||
| test.cpp:107:32:107:33 | fscanf output argument | test.cpp:108:7:108:7 | i | provenance | |
|
||||
| test.cpp:114:32:114:33 | sscanf output argument | test.cpp:115:7:115:7 | i | provenance | |
|
||||
| test.cpp:121:38:121:39 | _scanf_l output argument | test.cpp:123:8:123:8 | i | provenance | |
|
||||
| test.cpp:132:19:132:20 | scanf output argument | test.cpp:134:8:134:8 | i | provenance | |
|
||||
| test.cpp:141:19:141:20 | scanf output argument | test.cpp:143:8:143:8 | i | provenance | |
|
||||
| test.cpp:150:23:150:24 | scanf output argument | test.cpp:154:9:154:9 | i | provenance | |
|
||||
| test.cpp:181:19:181:20 | scanf output argument | test.cpp:185:8:185:8 | i | provenance | |
|
||||
| test.cpp:193:19:193:20 | scanf output argument | test.cpp:197:8:197:8 | i | provenance | |
|
||||
| test.cpp:211:22:211:23 | scanf output argument | test.cpp:213:8:213:8 | i | provenance | |
|
||||
| test.cpp:221:22:221:23 | scanf output argument | test.cpp:223:8:223:8 | i | provenance | |
|
||||
| test.cpp:221:26:221:27 | scanf output argument | test.cpp:224:8:224:8 | j | provenance | |
|
||||
| test.cpp:231:22:231:23 | scanf output argument | test.cpp:233:8:233:8 | i | provenance | |
|
||||
| test.cpp:231:26:231:27 | scanf output argument | test.cpp:234:8:234:8 | j | provenance | |
|
||||
| test.cpp:246:44:246:45 | scanf output argument | test.cpp:248:9:248:9 | d | provenance | |
|
||||
| test.cpp:250:33:250:34 | scanf output argument | test.cpp:252:9:252:9 | d | provenance | |
|
||||
| test.cpp:271:15:271:16 | scanf output argument | test.cpp:272:7:272:7 | i | provenance | |
|
||||
| test.cpp:279:15:279:16 | scanf output argument | test.cpp:280:7:280:7 | i | provenance | |
|
||||
| test.cpp:291:15:291:16 | scanf output argument | test.cpp:292:7:292:7 | i | provenance | |
|
||||
| test.cpp:325:34:325:35 | sscanf output argument | test.cpp:327:8:327:8 | i | provenance | |
|
||||
| test.cpp:325:38:325:39 | sscanf output argument | test.cpp:328:8:328:8 | j | provenance | |
|
||||
| test.cpp:335:22:335:23 | scanf output argument | test.cpp:337:8:337:8 | i | provenance | |
|
||||
| test.cpp:344:23:344:24 | scanf output argument | test.cpp:346:8:346:8 | i | provenance | |
|
||||
| test.cpp:353:26:353:27 | scanf output argument | test.cpp:354:8:354:8 | d | provenance | |
|
||||
| test.cpp:353:30:353:31 | scanf output argument | test.cpp:355:8:355:8 | n | provenance | |
|
||||
| test.cpp:362:62:362:63 | sscanf output argument | test.cpp:364:17:364:17 | n | provenance | |
|
||||
| test.cpp:403:29:403:30 | sscanf output argument | test.cpp:404:18:404:25 | u | provenance | |
|
||||
| test.cpp:413:19:413:20 | scanf output argument | test.cpp:416:7:416:7 | i | provenance | |
|
||||
| test.cpp:420:19:420:20 | scanf output argument | test.cpp:423:7:423:7 | i | provenance | |
|
||||
| test.cpp:455:41:455:46 | sscanf output argument | test.cpp:460:6:460:10 | value | provenance | |
|
||||
| test.cpp:467:20:467:25 | scanf output argument | test.cpp:474:6:474:10 | value | provenance | |
|
||||
nodes
|
||||
| test.cpp:34:15:34:16 | scanf output argument | semmle.label | scanf output argument |
|
||||
| test.cpp:35:7:35:7 | i | semmle.label | i |
|
||||
| test.cpp:41:19:41:20 | scanf output argument | semmle.label | scanf output argument |
|
||||
| test.cpp:43:8:43:8 | i | semmle.label | i |
|
||||
| test.cpp:58:19:58:20 | scanf output argument | semmle.label | scanf output argument |
|
||||
| test.cpp:60:8:60:8 | i | semmle.label | i |
|
||||
| test.cpp:67:15:67:16 | scanf output argument | semmle.label | scanf output argument |
|
||||
| test.cpp:68:7:68:7 | i | semmle.label | i |
|
||||
| test.cpp:70:19:70:20 | scanf output argument | semmle.label | scanf output argument |
|
||||
| test.cpp:72:8:72:8 | i | semmle.label | i |
|
||||
| test.cpp:79:15:79:16 | scanf output argument | semmle.label | scanf output argument |
|
||||
| test.cpp:80:7:80:7 | i | semmle.label | i |
|
||||
| test.cpp:89:15:89:15 | scanf output argument | semmle.label | scanf output argument |
|
||||
| test.cpp:90:7:90:8 | * ... | semmle.label | * ... |
|
||||
| test.cpp:97:15:97:15 | scanf output argument | semmle.label | scanf output argument |
|
||||
| test.cpp:98:7:98:8 | * ... | semmle.label | * ... |
|
||||
| test.cpp:107:32:107:33 | fscanf output argument | semmle.label | fscanf output argument |
|
||||
| test.cpp:108:7:108:7 | i | semmle.label | i |
|
||||
| test.cpp:114:32:114:33 | sscanf output argument | semmle.label | sscanf output argument |
|
||||
| test.cpp:115:7:115:7 | i | semmle.label | i |
|
||||
| test.cpp:121:38:121:39 | _scanf_l output argument | semmle.label | _scanf_l output argument |
|
||||
| test.cpp:123:8:123:8 | i | semmle.label | i |
|
||||
| test.cpp:132:19:132:20 | scanf output argument | semmle.label | scanf output argument |
|
||||
| test.cpp:134:8:134:8 | i | semmle.label | i |
|
||||
| test.cpp:141:19:141:20 | scanf output argument | semmle.label | scanf output argument |
|
||||
| test.cpp:143:8:143:8 | i | semmle.label | i |
|
||||
| test.cpp:150:23:150:24 | scanf output argument | semmle.label | scanf output argument |
|
||||
| test.cpp:154:9:154:9 | i | semmle.label | i |
|
||||
| test.cpp:181:19:181:20 | scanf output argument | semmle.label | scanf output argument |
|
||||
| test.cpp:185:8:185:8 | i | semmle.label | i |
|
||||
| test.cpp:193:19:193:20 | scanf output argument | semmle.label | scanf output argument |
|
||||
| test.cpp:197:8:197:8 | i | semmle.label | i |
|
||||
| test.cpp:211:22:211:23 | scanf output argument | semmle.label | scanf output argument |
|
||||
| test.cpp:213:8:213:8 | i | semmle.label | i |
|
||||
| test.cpp:221:22:221:23 | scanf output argument | semmle.label | scanf output argument |
|
||||
| test.cpp:221:26:221:27 | scanf output argument | semmle.label | scanf output argument |
|
||||
| test.cpp:223:8:223:8 | i | semmle.label | i |
|
||||
| test.cpp:224:8:224:8 | j | semmle.label | j |
|
||||
| test.cpp:231:22:231:23 | scanf output argument | semmle.label | scanf output argument |
|
||||
| test.cpp:231:26:231:27 | scanf output argument | semmle.label | scanf output argument |
|
||||
| test.cpp:233:8:233:8 | i | semmle.label | i |
|
||||
| test.cpp:234:8:234:8 | j | semmle.label | j |
|
||||
| test.cpp:246:44:246:45 | scanf output argument | semmle.label | scanf output argument |
|
||||
| test.cpp:248:9:248:9 | d | semmle.label | d |
|
||||
| test.cpp:250:33:250:34 | scanf output argument | semmle.label | scanf output argument |
|
||||
| test.cpp:252:9:252:9 | d | semmle.label | d |
|
||||
| test.cpp:271:15:271:16 | scanf output argument | semmle.label | scanf output argument |
|
||||
| test.cpp:272:7:272:7 | i | semmle.label | i |
|
||||
| test.cpp:279:15:279:16 | scanf output argument | semmle.label | scanf output argument |
|
||||
| test.cpp:280:7:280:7 | i | semmle.label | i |
|
||||
| test.cpp:291:15:291:16 | scanf output argument | semmle.label | scanf output argument |
|
||||
| test.cpp:292:7:292:7 | i | semmle.label | i |
|
||||
| test.cpp:325:34:325:35 | sscanf output argument | semmle.label | sscanf output argument |
|
||||
| test.cpp:325:38:325:39 | sscanf output argument | semmle.label | sscanf output argument |
|
||||
| test.cpp:327:8:327:8 | i | semmle.label | i |
|
||||
| test.cpp:328:8:328:8 | j | semmle.label | j |
|
||||
| test.cpp:335:22:335:23 | scanf output argument | semmle.label | scanf output argument |
|
||||
| test.cpp:337:8:337:8 | i | semmle.label | i |
|
||||
| test.cpp:344:23:344:24 | scanf output argument | semmle.label | scanf output argument |
|
||||
| test.cpp:346:8:346:8 | i | semmle.label | i |
|
||||
| test.cpp:353:26:353:27 | scanf output argument | semmle.label | scanf output argument |
|
||||
| test.cpp:353:30:353:31 | scanf output argument | semmle.label | scanf output argument |
|
||||
| test.cpp:354:8:354:8 | d | semmle.label | d |
|
||||
| test.cpp:355:8:355:8 | n | semmle.label | n |
|
||||
| test.cpp:362:62:362:63 | sscanf output argument | semmle.label | sscanf output argument |
|
||||
| test.cpp:364:17:364:17 | n | semmle.label | n |
|
||||
| test.cpp:403:29:403:30 | sscanf output argument | semmle.label | sscanf output argument |
|
||||
| test.cpp:404:18:404:25 | u | semmle.label | u |
|
||||
| test.cpp:413:19:413:20 | scanf output argument | semmle.label | scanf output argument |
|
||||
| test.cpp:416:7:416:7 | i | semmle.label | i |
|
||||
| test.cpp:420:19:420:20 | scanf output argument | semmle.label | scanf output argument |
|
||||
| test.cpp:423:7:423:7 | i | semmle.label | i |
|
||||
| test.cpp:455:41:455:46 | sscanf output argument | semmle.label | sscanf output argument |
|
||||
| test.cpp:460:6:460:10 | value | semmle.label | value |
|
||||
| test.cpp:467:20:467:25 | scanf output argument | semmle.label | scanf output argument |
|
||||
| test.cpp:474:6:474:10 | value | semmle.label | value |
|
||||
subpaths
|
||||
#select
|
||||
| test.cpp:35:7:35:7 | i | test.cpp:34:15:34:16 | scanf output argument | test.cpp:35:7:35:7 | i | This variable is read, but may not have been written. It should be guarded by a check that the $@ returns at least 1. | test.cpp:34:3:34:7 | call to scanf | call to scanf |
|
||||
| test.cpp:68:7:68:7 | i | test.cpp:67:15:67:16 | scanf output argument | test.cpp:68:7:68:7 | i | This variable is read, but may not have been written. It should be guarded by a check that the $@ returns at least 1. | test.cpp:67:3:67:7 | call to scanf | call to scanf |
|
||||
| test.cpp:80:7:80:7 | i | test.cpp:79:15:79:16 | scanf output argument | test.cpp:80:7:80:7 | i | This variable is read, but may not have been written. It should be guarded by a check that the $@ returns at least 1. | test.cpp:79:3:79:7 | call to scanf | call to scanf |
|
||||
| test.cpp:90:7:90:8 | * ... | test.cpp:89:15:89:15 | scanf output argument | test.cpp:90:7:90:8 | * ... | This variable is read, but may not have been written. It should be guarded by a check that the $@ returns at least 1. | test.cpp:89:3:89:7 | call to scanf | call to scanf |
|
||||
| test.cpp:98:7:98:8 | * ... | test.cpp:97:15:97:15 | scanf output argument | test.cpp:98:7:98:8 | * ... | This variable is read, but may not have been written. It should be guarded by a check that the $@ returns at least 1. | test.cpp:97:3:97:7 | call to scanf | call to scanf |
|
||||
| test.cpp:108:7:108:7 | i | test.cpp:107:32:107:33 | fscanf output argument | test.cpp:108:7:108:7 | i | This variable is read, but may not have been written. It should be guarded by a check that the $@ returns at least 1. | test.cpp:107:3:107:8 | call to fscanf | call to fscanf |
|
||||
| test.cpp:115:7:115:7 | i | test.cpp:114:32:114:33 | sscanf output argument | test.cpp:115:7:115:7 | i | This variable is read, but may not have been written. It should be guarded by a check that the $@ returns at least 1. | test.cpp:114:3:114:8 | call to sscanf | call to sscanf |
|
||||
| test.cpp:224:8:224:8 | j | test.cpp:221:26:221:27 | scanf output argument | test.cpp:224:8:224:8 | j | This variable is read, but may not have been written. It should be guarded by a check that the $@ returns at least 2. | test.cpp:221:7:221:11 | call to scanf | call to scanf |
|
||||
| test.cpp:248:9:248:9 | d | test.cpp:246:44:246:45 | scanf output argument | test.cpp:248:9:248:9 | d | This variable is read, but may not have been written. It should be guarded by a check that the $@ returns at least 2. | test.cpp:246:25:246:29 | call to scanf | call to scanf |
|
||||
| test.cpp:252:9:252:9 | d | test.cpp:250:33:250:34 | scanf output argument | test.cpp:252:9:252:9 | d | This variable is read, but may not have been written. It should be guarded by a check that the $@ returns at least 2. | test.cpp:250:14:250:18 | call to scanf | call to scanf |
|
||||
| test.cpp:272:7:272:7 | i | test.cpp:271:15:271:16 | scanf output argument | test.cpp:272:7:272:7 | i | This variable is read, but may not have been written. It should be guarded by a check that the $@ returns at least 1. | test.cpp:271:3:271:7 | call to scanf | call to scanf |
|
||||
| test.cpp:280:7:280:7 | i | test.cpp:279:15:279:16 | scanf output argument | test.cpp:280:7:280:7 | i | This variable is read, but may not have been written. It should be guarded by a check that the $@ returns at least 1. | test.cpp:279:3:279:7 | call to scanf | call to scanf |
|
||||
| test.cpp:292:7:292:7 | i | test.cpp:291:15:291:16 | scanf output argument | test.cpp:292:7:292:7 | i | This variable is read, but may not have been written. It should be guarded by a check that the $@ returns at least 1. | test.cpp:291:3:291:7 | call to scanf | call to scanf |
|
||||
| test.cpp:404:25:404:25 | u | test.cpp:403:29:403:30 | sscanf output argument | test.cpp:404:18:404:25 | u | This variable is read, but may not have been written. It should be guarded by a check that the $@ returns at least 1. | test.cpp:403:6:403:11 | call to sscanf | call to sscanf |
|
||||
| test.cpp:416:7:416:7 | i | test.cpp:413:19:413:20 | scanf output argument | test.cpp:416:7:416:7 | i | This variable is read, but may not have been written. It should be guarded by a check that the $@ returns at least 1. | test.cpp:413:7:413:11 | call to scanf | call to scanf |
|
||||
| test.cpp:423:7:423:7 | i | test.cpp:420:19:420:20 | scanf output argument | test.cpp:423:7:423:7 | i | This variable is read, but may not have been written. It should be guarded by a check that the $@ returns at least 1. | test.cpp:420:7:420:11 | call to scanf | call to scanf |
|
||||
| test.cpp:460:6:460:10 | value | test.cpp:455:41:455:46 | sscanf output argument | test.cpp:460:6:460:10 | value | This variable is read, but may not have been written. It should be guarded by a check that the $@ returns at least 1. | test.cpp:455:12:455:17 | call to sscanf | call to sscanf |
|
||||
| test.cpp:474:6:474:10 | value | test.cpp:467:20:467:25 | scanf output argument | test.cpp:474:6:474:10 | value | This variable is read, but may not have been written. It should be guarded by a check that the $@ returns at least 1. | test.cpp:467:8:467:12 | call to scanf | call to scanf |
|
||||
|
||||
@@ -8,15 +8,10 @@ edges
|
||||
| nested.cpp:35:19:35:21 | *fmt | nested.cpp:27:32:27:34 | *fmt | provenance | |
|
||||
| nested.cpp:42:24:42:34 | *call to ext_fmt_str | nested.cpp:34:37:34:39 | *fmt | provenance | |
|
||||
| nested.cpp:86:19:86:46 | *call to __builtin_alloca | nested.cpp:87:18:87:20 | *fmt | provenance | |
|
||||
| test.cpp:27:39:27:39 | n | test.cpp:27:13:27:24 | **make_message | provenance | |
|
||||
| test.cpp:46:14:46:17 | argc | test.cpp:51:23:51:30 | ... - ... | provenance | |
|
||||
| test.cpp:46:27:46:30 | **argv | test.cpp:130:20:130:26 | *access to array | provenance | |
|
||||
| test.cpp:51:23:51:30 | ... - ... | test.cpp:27:39:27:39 | n | provenance | |
|
||||
| test.cpp:51:23:51:30 | ... - ... | test.cpp:51:10:51:21 | *call to make_message | provenance | |
|
||||
| test.cpp:155:27:155:30 | data | test.cpp:157:12:157:15 | data | provenance | |
|
||||
| test.cpp:167:31:167:34 | data | test.cpp:170:12:170:14 | *res | provenance | |
|
||||
| test.cpp:193:32:193:34 | str | test.cpp:195:31:195:33 | str | provenance | |
|
||||
| test.cpp:193:32:193:34 | str | test.cpp:197:11:197:14 | *wstr | provenance | |
|
||||
| test.cpp:167:31:167:34 | *data | test.cpp:170:12:170:14 | *res | provenance | |
|
||||
| test.cpp:193:32:193:34 | *str | test.cpp:195:31:195:33 | *str | provenance | |
|
||||
| test.cpp:193:32:193:34 | *str | test.cpp:197:11:197:14 | *wstr | provenance | |
|
||||
| test.cpp:204:25:204:36 | *call to get_string | test.cpp:205:12:205:20 | *... + ... | provenance | |
|
||||
| test.cpp:204:25:204:36 | *call to get_string | test.cpp:206:12:206:16 | *hello | provenance | |
|
||||
| test.cpp:209:25:209:36 | *call to get_string | test.cpp:211:12:211:16 | *hello | provenance | |
|
||||
@@ -42,19 +37,12 @@ nodes
|
||||
| nested.cpp:79:32:79:38 | *call to get_fmt | semmle.label | *call to get_fmt |
|
||||
| nested.cpp:86:19:86:46 | *call to __builtin_alloca | semmle.label | *call to __builtin_alloca |
|
||||
| nested.cpp:87:18:87:20 | *fmt | semmle.label | *fmt |
|
||||
| test.cpp:27:13:27:24 | **make_message | semmle.label | **make_message |
|
||||
| test.cpp:27:39:27:39 | n | semmle.label | n |
|
||||
| test.cpp:46:14:46:17 | argc | semmle.label | argc |
|
||||
| test.cpp:46:27:46:30 | **argv | semmle.label | **argv |
|
||||
| test.cpp:51:10:51:21 | *call to make_message | semmle.label | *call to make_message |
|
||||
| test.cpp:51:23:51:30 | ... - ... | semmle.label | ... - ... |
|
||||
| test.cpp:130:20:130:26 | *access to array | semmle.label | *access to array |
|
||||
| test.cpp:155:27:155:30 | data | semmle.label | data |
|
||||
| test.cpp:157:12:157:15 | data | semmle.label | data |
|
||||
| test.cpp:167:31:167:34 | data | semmle.label | data |
|
||||
| test.cpp:167:31:167:34 | *data | semmle.label | *data |
|
||||
| test.cpp:170:12:170:14 | *res | semmle.label | *res |
|
||||
| test.cpp:193:32:193:34 | str | semmle.label | str |
|
||||
| test.cpp:195:31:195:33 | str | semmle.label | str |
|
||||
| test.cpp:193:32:193:34 | *str | semmle.label | *str |
|
||||
| test.cpp:195:31:195:33 | *str | semmle.label | *str |
|
||||
| test.cpp:197:11:197:14 | *wstr | semmle.label | *wstr |
|
||||
| test.cpp:204:25:204:36 | *call to get_string | semmle.label | *call to get_string |
|
||||
| test.cpp:205:12:205:20 | *... + ... | semmle.label | *... + ... |
|
||||
@@ -74,7 +62,6 @@ nodes
|
||||
| test.cpp:245:25:245:36 | *call to get_string | semmle.label | *call to get_string |
|
||||
| test.cpp:247:12:247:16 | *hello | semmle.label | *hello |
|
||||
subpaths
|
||||
| test.cpp:51:23:51:30 | ... - ... | test.cpp:27:39:27:39 | n | test.cpp:27:13:27:24 | **make_message | test.cpp:51:10:51:21 | *call to make_message |
|
||||
#select
|
||||
| NonConstantFormat.c:30:10:30:16 | *access to array | NonConstantFormat.c:28:27:28:30 | **argv | NonConstantFormat.c:30:10:30:16 | *access to array | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | NonConstantFormat.c:30:3:30:8 | call to printf | printf |
|
||||
| NonConstantFormat.c:41:9:41:45 | *call to any_random_function | NonConstantFormat.c:41:9:41:45 | *call to any_random_function | NonConstantFormat.c:41:9:41:45 | *call to any_random_function | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | NonConstantFormat.c:41:2:41:7 | call to printf | printf |
|
||||
@@ -82,12 +69,10 @@ subpaths
|
||||
| nested.cpp:21:23:21:26 | *fmt0 | nested.cpp:42:24:42:34 | *call to ext_fmt_str | nested.cpp:21:23:21:26 | *fmt0 | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | nested.cpp:21:5:21:12 | call to snprintf | snprintf |
|
||||
| nested.cpp:79:32:79:38 | *call to get_fmt | nested.cpp:79:32:79:38 | *call to get_fmt | nested.cpp:79:32:79:38 | *call to get_fmt | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | nested.cpp:79:5:79:14 | call to diagnostic | diagnostic |
|
||||
| nested.cpp:87:18:87:20 | *fmt | nested.cpp:86:19:86:46 | *call to __builtin_alloca | nested.cpp:87:18:87:20 | *fmt | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | nested.cpp:87:7:87:16 | call to diagnostic | diagnostic |
|
||||
| test.cpp:51:10:51:21 | *call to make_message | test.cpp:46:14:46:17 | argc | test.cpp:51:10:51:21 | *call to make_message | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | test.cpp:51:3:51:8 | call to printf | printf |
|
||||
| test.cpp:130:20:130:26 | *access to array | test.cpp:46:27:46:30 | **argv | test.cpp:130:20:130:26 | *access to array | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | test.cpp:130:2:130:10 | call to sprintf | sprintf |
|
||||
| test.cpp:157:12:157:15 | data | test.cpp:155:27:155:30 | data | test.cpp:157:12:157:15 | data | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | test.cpp:157:5:157:10 | call to printf | printf |
|
||||
| test.cpp:170:12:170:14 | *res | test.cpp:167:31:167:34 | data | test.cpp:170:12:170:14 | *res | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | test.cpp:170:5:170:10 | call to printf | printf |
|
||||
| test.cpp:195:31:195:33 | str | test.cpp:193:32:193:34 | str | test.cpp:195:31:195:33 | str | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | test.cpp:195:3:195:18 | call to StringCchPrintfW | StringCchPrintfW |
|
||||
| test.cpp:197:11:197:14 | *wstr | test.cpp:193:32:193:34 | str | test.cpp:197:11:197:14 | *wstr | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | test.cpp:197:3:197:9 | call to wprintf | wprintf |
|
||||
| test.cpp:170:12:170:14 | *res | test.cpp:167:31:167:34 | *data | test.cpp:170:12:170:14 | *res | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | test.cpp:170:5:170:10 | call to printf | printf |
|
||||
| test.cpp:195:31:195:33 | *str | test.cpp:193:32:193:34 | *str | test.cpp:195:31:195:33 | *str | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | test.cpp:195:3:195:18 | call to StringCchPrintfW | StringCchPrintfW |
|
||||
| test.cpp:197:11:197:14 | *wstr | test.cpp:193:32:193:34 | *str | test.cpp:197:11:197:14 | *wstr | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | test.cpp:197:3:197:9 | call to wprintf | wprintf |
|
||||
| test.cpp:205:12:205:20 | *... + ... | test.cpp:204:25:204:36 | *call to get_string | test.cpp:205:12:205:20 | *... + ... | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | test.cpp:205:5:205:10 | call to printf | printf |
|
||||
| test.cpp:206:12:206:16 | *hello | test.cpp:204:25:204:36 | *call to get_string | test.cpp:206:12:206:16 | *hello | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | test.cpp:206:5:206:10 | call to printf | printf |
|
||||
| test.cpp:211:12:211:16 | *hello | test.cpp:209:25:209:36 | *call to get_string | test.cpp:211:12:211:16 | *hello | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | test.cpp:211:5:211:10 | call to printf | printf |
|
||||
|
||||
@@ -48,7 +48,7 @@ int main(int argc, char **argv) {
|
||||
printf(choose_message(argc - 1), argc - 1); // GOOD
|
||||
printf(messages[1]); // GOOD
|
||||
printf(message); // GOOD
|
||||
printf(make_message(argc - 1)); // BAD
|
||||
printf(make_message(argc - 1)); // BAD [NOT DETECTED]
|
||||
printf("Hello, World\n"); // GOOD
|
||||
printf(_("Hello, World\n")); // GOOD
|
||||
{
|
||||
@@ -154,7 +154,7 @@ void print_ith_message() {
|
||||
|
||||
void fmt_via_strcpy(char *data) {
|
||||
strcpy(data, "some string");
|
||||
printf(data); // GOOD [FALSE POSITIVE: Due to inaccurate dataflow killers]
|
||||
printf(data); // GOOD
|
||||
}
|
||||
|
||||
void fmt_with_assignment() {
|
||||
|
||||
@@ -5,12 +5,7 @@
|
||||
| test2.cpp:31:32:31:65 | call to context | This usage of 'boost::asio::ssl::context::context' with protocol $@ is not configured correctly: The option $@. | test2.cpp:31:32:31:64 | sslv23 | sslv23 | test2.cpp:31:32:31:65 | call to context | no_sslv3 has not been set |
|
||||
| test2.cpp:31:32:31:65 | call to context | This usage of 'boost::asio::ssl::context::context' with protocol $@ is not configured correctly: The option $@. | test2.cpp:31:32:31:64 | sslv23 | sslv23 | test2.cpp:31:32:31:65 | call to context | no_tlsv1 has not been set |
|
||||
| test2.cpp:31:32:31:65 | call to context | This usage of 'boost::asio::ssl::context::context' with protocol $@ is not configured correctly: The option $@. | test2.cpp:31:32:31:64 | sslv23 | sslv23 | test2.cpp:31:32:31:65 | call to context | no_tlsv1_1 has not been set |
|
||||
| test2.cpp:38:35:38:98 | call to context | This usage of 'boost::asio::ssl::context::context' with protocol $@ is not configured correctly: The option $@. | test2.cpp:38:65:38:97 | sslv23 | sslv23 | test2.cpp:38:35:38:98 | call to context | no_sslv3 has not been set |
|
||||
| test2.cpp:38:35:38:98 | call to context | This usage of 'boost::asio::ssl::context::context' with protocol $@ is not configured correctly: The option $@. | test2.cpp:38:65:38:97 | sslv23 | sslv23 | test2.cpp:38:35:38:98 | call to context | no_tlsv1 has not been set |
|
||||
| test2.cpp:38:35:38:98 | call to context | This usage of 'boost::asio::ssl::context::context' with protocol $@ is not configured correctly: The option $@. | test2.cpp:38:65:38:97 | sslv23 | sslv23 | test2.cpp:38:35:38:98 | call to context | no_tlsv1_1 has not been set |
|
||||
| test2.cpp:45:35:45:98 | call to context | This usage of 'boost::asio::ssl::context::context' with protocol $@ is not configured correctly: The option $@. | test2.cpp:45:65:45:97 | sslv23 | sslv23 | test2.cpp:45:35:45:98 | call to context | no_sslv3 has not been set |
|
||||
| test2.cpp:45:35:45:98 | call to context | This usage of 'boost::asio::ssl::context::context' with protocol $@ is not configured correctly: The option $@. | test2.cpp:45:65:45:97 | sslv23 | sslv23 | test2.cpp:45:35:45:98 | call to context | no_tlsv1 has not been set |
|
||||
| test2.cpp:45:35:45:98 | call to context | This usage of 'boost::asio::ssl::context::context' with protocol $@ is not configured correctly: The option $@. | test2.cpp:45:65:45:97 | sslv23 | sslv23 | test2.cpp:45:35:45:98 | call to context | no_tlsv1_1 has not been set |
|
||||
| test2.cpp:52:32:52:65 | call to context | This usage of 'boost::asio::ssl::context::context' with protocol $@ is not configured correctly: The option $@. | test2.cpp:52:32:52:64 | sslv23 | sslv23 | test2.cpp:52:32:52:65 | call to context | no_sslv3 has not been set |
|
||||
| test2.cpp:52:32:52:65 | call to context | This usage of 'boost::asio::ssl::context::context' with protocol $@ is not configured correctly: The option $@. | test2.cpp:52:32:52:64 | sslv23 | sslv23 | test2.cpp:52:32:52:65 | call to context | no_tlsv1 has not been set |
|
||||
| test2.cpp:52:32:52:65 | call to context | This usage of 'boost::asio::ssl::context::context' with protocol $@ is not configured correctly: The option $@. | test2.cpp:52:32:52:64 | sslv23 | sslv23 | test2.cpp:52:32:52:65 | call to context | no_tlsv1_1 has not been set |
|
||||
|
||||
@@ -34,7 +34,7 @@ void bad2()
|
||||
|
||||
void good3()
|
||||
{
|
||||
// GOOD [FALSE POSITIVE]
|
||||
// GOOD
|
||||
boost::asio::ssl::context *ctx = new boost::asio::ssl::context(boost::asio::ssl::context::sslv23);
|
||||
ctx->set_options(boost::asio::ssl::context::no_tlsv1 | boost::asio::ssl::context::no_tlsv1_1 | boost::asio::ssl::context::no_sslv3);
|
||||
}
|
||||
|
||||
@@ -23,9 +23,7 @@ edges
|
||||
| consts.cpp:106:13:106:19 | *call to varFunc | consts.cpp:107:9:107:10 | *v5 | provenance | |
|
||||
| consts.cpp:111:7:111:13 | *call to varFunc | consts.cpp:112:9:112:10 | *v6 | provenance | |
|
||||
| consts.cpp:139:13:139:16 | readString output argument | consts.cpp:140:9:140:11 | *v11 | provenance | |
|
||||
| consts.cpp:139:13:139:16 | readString output argument | consts.cpp:140:9:140:11 | v11 | provenance | |
|
||||
| consts.cpp:144:16:144:18 | readStringRef output argument | consts.cpp:145:9:145:11 | *v12 | provenance | |
|
||||
| consts.cpp:144:16:144:18 | readStringRef output argument | consts.cpp:145:9:145:11 | v12 | provenance | |
|
||||
nodes
|
||||
| consts.cpp:24:7:24:9 | **gv1 | semmle.label | **gv1 |
|
||||
| consts.cpp:29:7:29:25 | **nonConstFuncToArray | semmle.label | **nonConstFuncToArray |
|
||||
@@ -47,13 +45,9 @@ nodes
|
||||
| consts.cpp:130:9:130:10 | *v9 | semmle.label | *v9 |
|
||||
| consts.cpp:135:9:135:11 | *v10 | semmle.label | *v10 |
|
||||
| consts.cpp:139:13:139:16 | readString output argument | semmle.label | readString output argument |
|
||||
| consts.cpp:139:13:139:16 | readString output argument | semmle.label | readString output argument |
|
||||
| consts.cpp:140:9:140:11 | *v11 | semmle.label | *v11 |
|
||||
| consts.cpp:140:9:140:11 | v11 | semmle.label | v11 |
|
||||
| consts.cpp:144:16:144:18 | readStringRef output argument | semmle.label | readStringRef output argument |
|
||||
| consts.cpp:144:16:144:18 | readStringRef output argument | semmle.label | readStringRef output argument |
|
||||
| consts.cpp:145:9:145:11 | *v12 | semmle.label | *v12 |
|
||||
| consts.cpp:145:9:145:11 | v12 | semmle.label | v12 |
|
||||
subpaths
|
||||
#select
|
||||
| consts.cpp:86:9:86:10 | *v1 | consts.cpp:85:7:85:8 | gets output argument | consts.cpp:86:9:86:10 | *v1 | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | consts.cpp:86:2:86:7 | call to printf | printf |
|
||||
@@ -78,6 +72,4 @@ subpaths
|
||||
| consts.cpp:135:9:135:11 | *v10 | consts.cpp:85:7:85:8 | gets output argument | consts.cpp:135:9:135:11 | *v10 | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | consts.cpp:135:2:135:7 | call to printf | printf |
|
||||
| consts.cpp:135:9:135:11 | *v10 | consts.cpp:90:12:90:13 | gets output argument | consts.cpp:135:9:135:11 | *v10 | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | consts.cpp:135:2:135:7 | call to printf | printf |
|
||||
| consts.cpp:140:9:140:11 | *v11 | consts.cpp:139:13:139:16 | readString output argument | consts.cpp:140:9:140:11 | *v11 | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | consts.cpp:140:2:140:7 | call to printf | printf |
|
||||
| consts.cpp:140:9:140:11 | v11 | consts.cpp:139:13:139:16 | readString output argument | consts.cpp:140:9:140:11 | v11 | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | consts.cpp:140:2:140:7 | call to printf | printf |
|
||||
| consts.cpp:145:9:145:11 | *v12 | consts.cpp:144:16:144:18 | readStringRef output argument | consts.cpp:145:9:145:11 | *v12 | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | consts.cpp:145:2:145:7 | call to printf | printf |
|
||||
| consts.cpp:145:9:145:11 | v12 | consts.cpp:144:16:144:18 | readStringRef output argument | consts.cpp:145:9:145:11 | v12 | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | consts.cpp:145:2:145:7 | call to printf | printf |
|
||||
|
||||
@@ -1,13 +1,29 @@
|
||||
| test.cpp:12:6:12:8 | foo | The variable $@ may not be initialized at this access. | test.cpp:11:6:11:8 | foo | foo |
|
||||
| test.cpp:113:6:113:8 | foo | The variable $@ may not be initialized at this access. | test.cpp:111:6:111:8 | foo | foo |
|
||||
| test.cpp:219:3:219:3 | x | The variable $@ may not be initialized at this access. | test.cpp:218:7:218:7 | x | x |
|
||||
| test.cpp:243:13:243:13 | i | The variable $@ may not be initialized at this access. | test.cpp:241:6:241:6 | i | i |
|
||||
| test.cpp:336:10:336:10 | a | The variable $@ may not be initialized at this access. | test.cpp:333:7:333:7 | a | a |
|
||||
| test.cpp:369:10:369:10 | a | The variable $@ may not be initialized at this access. | test.cpp:358:7:358:7 | a | a |
|
||||
| test.cpp:378:9:378:11 | val | The variable $@ may not be initialized at this access. | test.cpp:359:6:359:8 | val | val |
|
||||
| test.cpp:417:10:417:10 | j | The variable $@ may not be initialized at this access. | test.cpp:414:9:414:9 | j | j |
|
||||
| test.cpp:436:9:436:9 | j | The variable $@ may not be initialized at this access. | test.cpp:431:9:431:9 | j | j |
|
||||
| test.cpp:454:2:454:2 | x | The variable $@ may not be initialized at this access. | test.cpp:452:6:452:6 | x | x |
|
||||
| test.cpp:460:7:460:7 | x | The variable $@ may not be initialized at this access. | test.cpp:458:6:458:6 | x | x |
|
||||
| test.cpp:467:2:467:2 | x | The variable $@ may not be initialized at this access. | test.cpp:464:6:464:6 | x | x |
|
||||
| test.cpp:474:7:474:7 | x | The variable $@ may not be initialized at this access. | test.cpp:471:6:471:6 | x | x |
|
||||
edges
|
||||
nodes
|
||||
| test.cpp:11:6:11:8 | definition of foo | semmle.label | definition of foo |
|
||||
| test.cpp:111:6:111:8 | definition of foo | semmle.label | definition of foo |
|
||||
| test.cpp:218:7:218:7 | definition of x | semmle.label | definition of x |
|
||||
| test.cpp:241:6:241:6 | definition of i | semmle.label | definition of i |
|
||||
| test.cpp:333:7:333:7 | definition of a | semmle.label | definition of a |
|
||||
| test.cpp:358:7:358:7 | definition of a | semmle.label | definition of a |
|
||||
| test.cpp:359:6:359:8 | definition of val | semmle.label | definition of val |
|
||||
| test.cpp:414:9:414:9 | definition of j | semmle.label | definition of j |
|
||||
| test.cpp:431:9:431:9 | definition of j | semmle.label | definition of j |
|
||||
| test.cpp:452:6:452:6 | definition of x | semmle.label | definition of x |
|
||||
| test.cpp:458:6:458:6 | definition of x | semmle.label | definition of x |
|
||||
| test.cpp:464:6:464:6 | definition of x | semmle.label | definition of x |
|
||||
| test.cpp:471:6:471:6 | definition of x | semmle.label | definition of x |
|
||||
#select
|
||||
| test.cpp:12:6:12:8 | foo | test.cpp:11:6:11:8 | definition of foo | test.cpp:11:6:11:8 | definition of foo | The variable $@ may not be initialized at this access. | test.cpp:11:6:11:8 | foo | foo |
|
||||
| test.cpp:113:6:113:8 | foo | test.cpp:111:6:111:8 | definition of foo | test.cpp:111:6:111:8 | definition of foo | The variable $@ may not be initialized at this access. | test.cpp:111:6:111:8 | foo | foo |
|
||||
| test.cpp:219:3:219:3 | x | test.cpp:218:7:218:7 | definition of x | test.cpp:218:7:218:7 | definition of x | The variable $@ may not be initialized at this access. | test.cpp:218:7:218:7 | x | x |
|
||||
| test.cpp:243:13:243:13 | i | test.cpp:241:6:241:6 | definition of i | test.cpp:241:6:241:6 | definition of i | The variable $@ may not be initialized at this access. | test.cpp:241:6:241:6 | i | i |
|
||||
| test.cpp:336:10:336:10 | a | test.cpp:333:7:333:7 | definition of a | test.cpp:333:7:333:7 | definition of a | The variable $@ may not be initialized at this access. | test.cpp:333:7:333:7 | a | a |
|
||||
| test.cpp:369:10:369:10 | a | test.cpp:358:7:358:7 | definition of a | test.cpp:358:7:358:7 | definition of a | The variable $@ may not be initialized at this access. | test.cpp:358:7:358:7 | a | a |
|
||||
| test.cpp:378:9:378:11 | val | test.cpp:359:6:359:8 | definition of val | test.cpp:359:6:359:8 | definition of val | The variable $@ may not be initialized at this access. | test.cpp:359:6:359:8 | val | val |
|
||||
| test.cpp:417:10:417:10 | j | test.cpp:414:9:414:9 | definition of j | test.cpp:414:9:414:9 | definition of j | The variable $@ may not be initialized at this access. | test.cpp:414:9:414:9 | j | j |
|
||||
| test.cpp:436:9:436:9 | j | test.cpp:431:9:431:9 | definition of j | test.cpp:431:9:431:9 | definition of j | The variable $@ may not be initialized at this access. | test.cpp:431:9:431:9 | j | j |
|
||||
| test.cpp:454:2:454:2 | x | test.cpp:452:6:452:6 | definition of x | test.cpp:452:6:452:6 | definition of x | The variable $@ may not be initialized at this access. | test.cpp:452:6:452:6 | x | x |
|
||||
| test.cpp:460:7:460:7 | x | test.cpp:458:6:458:6 | definition of x | test.cpp:458:6:458:6 | definition of x | The variable $@ may not be initialized at this access. | test.cpp:458:6:458:6 | x | x |
|
||||
| test.cpp:467:2:467:2 | x | test.cpp:464:6:464:6 | definition of x | test.cpp:464:6:464:6 | definition of x | The variable $@ may not be initialized at this access. | test.cpp:464:6:464:6 | x | x |
|
||||
| test.cpp:474:7:474:7 | x | test.cpp:471:6:471:6 | definition of x | test.cpp:471:6:471:6 | definition of x | The variable $@ may not be initialized at this access. | test.cpp:471:6:471:6 | x | x |
|
||||
|
||||
@@ -10,3 +10,4 @@
|
||||
| test.cpp:112:1:112:1 | return ... | Function g14 should return a value of type int but does not return a value here |
|
||||
| test.cpp:134:2:134:36 | ExprStmt | Function g16 should return a value of type int but does not return a value here |
|
||||
| test.cpp:141:3:141:37 | ExprStmt | Function g17 should return a value of type int but does not return a value here |
|
||||
| test.cpp:189:2:189:16 | ExprStmt | Function g23 should return a value of type int but does not return a value here |
|
||||
|
||||
@@ -170,3 +170,21 @@ int g19(int x)
|
||||
int g21() {
|
||||
g20(); // GOOD
|
||||
}
|
||||
|
||||
class Aborting {
|
||||
public:
|
||||
[[noreturn]]
|
||||
~Aborting();
|
||||
|
||||
void a() {};
|
||||
};
|
||||
|
||||
int g22() {
|
||||
Aborting x;
|
||||
|
||||
x.a(); // GOOD
|
||||
}
|
||||
|
||||
int g23() {
|
||||
Aborting().a(); // GOOD [FALSE POSITIVE]
|
||||
}
|
||||
|
||||
@@ -1,175 +1,189 @@
|
||||
| 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 | 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 | 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 | 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 |
|
||||
| C1::C1 | false | 305 | 305 | C1 |
|
||||
| C1::C1 | false | 473 | 473 | C1 |
|
||||
| C1::C1 | false | 477 | 477 | C1 |
|
||||
| C1::C1 | false | 521 | 521 | ExprStmt |
|
||||
| C1::C1 | false | 524 | 524 | this |
|
||||
| C1::C1 | false | 526 | 526 | val |
|
||||
| C1::C1 | false | 529 | 529 | x |
|
||||
| C1::C1 | false | 532 | 532 | ... = ... |
|
||||
| C1::C1 | false | 535 | 535 | return ... |
|
||||
| C1::C1 | false | 538 | 538 | { ... } |
|
||||
| C1::C1 | true | 521 | 529 | |
|
||||
| C1::C1 | true | 524 | 526 | |
|
||||
| C1::C1 | true | 526 | 532 | |
|
||||
| C1::C1 | true | 529 | 524 | |
|
||||
| C1::C1 | true | 532 | 535 | |
|
||||
| C1::C1 | true | 535 | 305 | |
|
||||
| C1::C1 | true | 538 | 521 | |
|
||||
| C1::operator= | false | 462 | 462 | operator= |
|
||||
| C1::operator= | false | 469 | 469 | operator= |
|
||||
| C1::operator== | false | 292 | 292 | operator== |
|
||||
| C1::operator== | false | 491 | 491 | return ... |
|
||||
| C1::operator== | false | 494 | 494 | this |
|
||||
| C1::operator== | false | 496 | 496 | val |
|
||||
| C1::operator== | false | 500 | 500 | other |
|
||||
| C1::operator== | false | 503 | 503 | (reference dereference) |
|
||||
| C1::operator== | false | 505 | 505 | val |
|
||||
| C1::operator== | false | 508 | 508 | ... == ... |
|
||||
| C1::operator== | false | 511 | 511 | { ... } |
|
||||
| C1::operator== | true | 491 | 494 | |
|
||||
| C1::operator== | true | 494 | 496 | |
|
||||
| C1::operator== | true | 496 | 500 | |
|
||||
| C1::operator== | true | 500 | 505 | |
|
||||
| C1::operator== | true | 505 | 508 | |
|
||||
| C1::operator== | true | 508 | 292 | |
|
||||
| C1::operator== | true | 511 | 491 | |
|
||||
| C2::C2 | false | 189 | 189 | C2 |
|
||||
| C2::C2 | false | 385 | 385 | C2 |
|
||||
| C2::C2 | false | 442 | 442 | ExprStmt |
|
||||
| C2::C2 | false | 445 | 445 | this |
|
||||
| C2::C2 | false | 447 | 447 | val |
|
||||
| C2::C2 | false | 450 | 450 | x |
|
||||
| C2::C2 | false | 453 | 453 | ... = ... |
|
||||
| C2::C2 | false | 456 | 456 | return ... |
|
||||
| C2::C2 | false | 459 | 459 | { ... } |
|
||||
| C2::C2 | true | 442 | 450 | |
|
||||
| C2::C2 | true | 445 | 447 | |
|
||||
| C2::C2 | true | 447 | 453 | |
|
||||
| C2::C2 | true | 450 | 445 | |
|
||||
| C2::C2 | true | 453 | 456 | |
|
||||
| C2::C2 | true | 456 | 189 | |
|
||||
| C2::C2 | true | 459 | 442 | |
|
||||
| C2::operator= | false | 379 | 379 | operator= |
|
||||
| C2::operator== | false | 176 | 176 | operator== |
|
||||
| C2::operator== | false | 399 | 399 | return ... |
|
||||
| C2::operator== | false | 402 | 402 | this |
|
||||
| C2::operator== | false | 404 | 404 | val |
|
||||
| C2::operator== | false | 408 | 408 | other |
|
||||
| C2::operator== | false | 411 | 411 | (reference dereference) |
|
||||
| C2::operator== | false | 413 | 413 | val |
|
||||
| C2::operator== | false | 416 | 416 | ... == ... |
|
||||
| C2::operator== | false | 419 | 419 | { ... } |
|
||||
| C2::operator== | true | 399 | 402 | |
|
||||
| C2::operator== | true | 402 | 404 | |
|
||||
| C2::operator== | true | 404 | 408 | |
|
||||
| C2::operator== | true | 408 | 413 | |
|
||||
| C2::operator== | true | 413 | 416 | |
|
||||
| C2::operator== | true | 416 | 176 | |
|
||||
| C2::operator== | true | 419 | 399 | |
|
||||
| C2::~C2 | false | 267 | 267 | ~C2 |
|
||||
| C2::~C2 | false | 426 | 426 | ; |
|
||||
| C2::~C2 | false | 429 | 429 | return ... |
|
||||
| C2::~C2 | false | 432 | 432 | { ... } |
|
||||
| C2::~C2 | true | 426 | 429 | |
|
||||
| C2::~C2 | true | 429 | 267 | |
|
||||
| C2::~C2 | true | 432 | 426 | |
|
||||
| __va_list_tag::operator= | false | 66 | 66 | operator= |
|
||||
| __va_list_tag::operator= | false | 72 | 72 | operator= |
|
||||
| f1 | false | 280 | 280 | f1 |
|
||||
| f1 | false | 286 | 286 | if (...) ... |
|
||||
| f1 | false | 301 | 301 | call to operator== |
|
||||
| f1 | false | 303 | 303 | call to C1 |
|
||||
| f1 | false | 310 | 310 | 1 |
|
||||
| f1 | false | 312 | 312 | temporary object |
|
||||
| f1 | false | 314 | 314 | (const C1)... |
|
||||
| f1 | false | 316 | 316 | call to C1 |
|
||||
| f1 | false | 322 | 322 | 2 |
|
||||
| f1 | false | 324 | 324 | temporary object |
|
||||
| f1 | false | 326 | 326 | (const C1)... |
|
||||
| f1 | false | 328 | 328 | (reference to) |
|
||||
| f1 | false | 330 | 330 | ; |
|
||||
| f1 | false | 333 | 333 | { ... } |
|
||||
| f1 | false | 336 | 336 | if (...) ... |
|
||||
| f1 | false | 340 | 340 | call to operator== |
|
||||
| f1 | false | 342 | 342 | call to C1 |
|
||||
| f1 | false | 348 | 348 | 3 |
|
||||
| f1 | false | 350 | 350 | temporary object |
|
||||
| f1 | false | 352 | 352 | (const C1)... |
|
||||
| f1 | false | 354 | 354 | call to C1 |
|
||||
| f1 | false | 360 | 360 | 3 |
|
||||
| f1 | false | 362 | 362 | temporary object |
|
||||
| f1 | false | 364 | 364 | (const C1)... |
|
||||
| f1 | false | 366 | 366 | (reference to) |
|
||||
| f1 | false | 368 | 368 | ; |
|
||||
| f1 | false | 371 | 371 | { ... } |
|
||||
| f1 | false | 374 | 374 | return ... |
|
||||
| f1 | false | 377 | 377 | { ... } |
|
||||
| f1 | true | 286 | 322 | |
|
||||
| f1 | true | 301 | 333 | T |
|
||||
| f1 | true | 301 | 336 | F |
|
||||
| f1 | true | 303 | 301 | |
|
||||
| f1 | true | 310 | 303 | |
|
||||
| f1 | true | 316 | 310 | |
|
||||
| f1 | true | 322 | 316 | |
|
||||
| f1 | true | 330 | 336 | |
|
||||
| f1 | true | 333 | 330 | |
|
||||
| f1 | true | 336 | 360 | |
|
||||
| f1 | true | 340 | 371 | T |
|
||||
| f1 | true | 340 | 374 | F |
|
||||
| f1 | true | 342 | 340 | |
|
||||
| f1 | true | 348 | 342 | |
|
||||
| f1 | true | 354 | 348 | |
|
||||
| f1 | true | 360 | 354 | |
|
||||
| f1 | true | 368 | 374 | |
|
||||
| f1 | true | 371 | 368 | |
|
||||
| f1 | true | 374 | 280 | |
|
||||
| f1 | true | 377 | 286 | |
|
||||
| f2 | false | 164 | 164 | f2 |
|
||||
| f2 | false | 170 | 170 | if (...) ... |
|
||||
| f2 | false | 185 | 185 | call to operator== |
|
||||
| f2 | false | 187 | 187 | call to C2 |
|
||||
| f2 | false | 194 | 194 | 1 |
|
||||
| f2 | false | 196 | 196 | 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 | |
|
||||
| f2 | false | 200 | 200 | call to C2 |
|
||||
| f2 | false | 206 | 206 | 2 |
|
||||
| f2 | false | 208 | 208 | temporary object |
|
||||
| f2 | false | 210 | 210 | (const C2)... |
|
||||
| f2 | false | 212 | 212 | (reference to) |
|
||||
| f2 | false | 214 | 214 | ; |
|
||||
| f2 | false | 217 | 217 | { ... } |
|
||||
| f2 | false | 220 | 220 | if (...) ... |
|
||||
| f2 | false | 224 | 224 | call to operator== |
|
||||
| f2 | false | 226 | 226 | call to C2 |
|
||||
| f2 | false | 232 | 232 | 3 |
|
||||
| f2 | false | 234 | 234 | temporary object |
|
||||
| f2 | false | 236 | 236 | (const C2)... |
|
||||
| f2 | false | 238 | 238 | call to C2 |
|
||||
| f2 | false | 244 | 244 | 3 |
|
||||
| f2 | false | 246 | 246 | temporary object |
|
||||
| f2 | false | 248 | 248 | (const C2)... |
|
||||
| f2 | false | 250 | 250 | (reference to) |
|
||||
| f2 | false | 252 | 252 | ; |
|
||||
| f2 | false | 255 | 255 | { ... } |
|
||||
| f2 | false | 258 | 258 | return ... |
|
||||
| f2 | false | 261 | 261 | { ... } |
|
||||
| f2 | false | 264 | 264 | reuse of temporary object |
|
||||
| f2 | false | 266 | 266 | call to ~C2 |
|
||||
| f2 | false | 269 | 269 | reuse of temporary object |
|
||||
| f2 | false | 271 | 271 | call to ~C2 |
|
||||
| f2 | false | 273 | 273 | reuse of temporary object |
|
||||
| f2 | false | 275 | 275 | call to ~C2 |
|
||||
| f2 | false | 277 | 277 | reuse of temporary object |
|
||||
| f2 | false | 279 | 279 | call to ~C2 |
|
||||
| f2 | true | 170 | 206 | |
|
||||
| f2 | true | 185 | 217 | T |
|
||||
| f2 | true | 185 | 220 | F |
|
||||
| f2 | true | 187 | 185 | |
|
||||
| f2 | true | 194 | 187 | |
|
||||
| f2 | true | 200 | 194 | |
|
||||
| f2 | true | 206 | 200 | |
|
||||
| f2 | true | 214 | 220 | |
|
||||
| f2 | true | 217 | 214 | |
|
||||
| f2 | true | 220 | 244 | |
|
||||
| f2 | true | 224 | 255 | T |
|
||||
| f2 | true | 224 | 258 | F |
|
||||
| f2 | true | 226 | 224 | |
|
||||
| f2 | true | 232 | 226 | |
|
||||
| f2 | true | 238 | 232 | |
|
||||
| f2 | true | 244 | 238 | |
|
||||
| f2 | true | 252 | 258 | |
|
||||
| f2 | true | 255 | 252 | |
|
||||
| f2 | true | 258 | 164 | |
|
||||
| f2 | true | 261 | 170 | |
|
||||
| f2 | true | 264 | 266 | |
|
||||
| f2 | true | 269 | 271 | |
|
||||
| f2 | true | 271 | 264 | |
|
||||
| f2 | true | 273 | 275 | |
|
||||
| f2 | true | 277 | 279 | |
|
||||
| f2 | true | 279 | 273 | |
|
||||
|
||||
Reference in New Issue
Block a user