Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions regression/cbmc/long_assertion_line_number/main.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
#define __CBMC_assert(cond) \
__CPROVER_assert((cond), "assertion"); \
__CPROVER_assume(cond)
extern int __VERIFIER_nondet_int();
int main()
{
int A[1];
A[0] = __VERIFIER_nondet_int();
/* clang-format off */
__CBMC_assert((A[0] < (-1) && A[0] < ~(4294967294U) && A[0] < 0LL && (A[0] > -214748647LL && ((((A[0] < 20158765) && A[0] > 2147483648U && A[0] > 1929301145 && (A[0] > 1944729020 && A[0] < 0 && A[0] < -1LL && A[0] > 4294967294ULL && A[0] != ~(2147483647U)) && A[0] > ~(4294967294U) && A[0] < ~(4294967295U))) && (A[0] > ~(2147483646U) && (A[0] < 1L && A[0] > 1ULL && A[0] > 1LL && A[0] < ~(-1) && A[0] < 2147483647ULL) && (A[0] < 0U) && (A[0] < 2147483647L && (A[0] < 0U && (A[0] < 1UL)) && (((A[0] > ~(0U) || A[0] < ~(1U)) || A[0] > 1321734560)) && A[0] < 4294967294ULL) && (A[0] < 1UL && ((A[0] > 2147483646U && A[0] <= 1U) && A[0] < 1U) && A[0] > 1U) && A[0] > 1ULL) && A[0] > 1L && (A[0] < 4294967295UL && A[0] < 4294967294UL && A[0] < 1L && (A[0] > ~(2147483647) && A[0] < 2147483647UL && A[0] < 2147483647L && A[0] < 0U) && ((A[0] > ~(1) && (A[0] > 1UL) && (A[0] > 2147483648U) && A[0] <= 2147483647) && A[0] > 1L)) && (A[0] < 4294967294UL && A[0] < ~(4294967294U) && A[0] > -1453357121 && A[0] < 1U) && A[0] < 2147483646U && (A[0] > 1L && (((A[0] < 1UL)) && A[0] < ~(0) && A[0] != ~(-1)) && A[0] < 4294967294ULL) && (A[0] < ~(4294967295U)) && A[0] <= 2147483647LL) && ((A[0] < 0U && ((A[0] > ~(2147483646U) && ((A[0] < ~(-2147483647)) && A[0] > ~(0) && A[0] > -1 && A[0] < -1L && (A[0] < 2147483646LL && (A[0] < -1) && ((A[0] < 2))) && (A[0] < 2147483647L && (A[0] < 2147483646LL && A[0] < 4294967295U) && A[0] > ~(4294967294U))) && ((A[0] > ~(1U)) && ((A[0] < 1U && (A[0] < 0 && A[0] < 2147483647U && (A[0] > 4294967294ULL)) && (A[0] < 2147483647ULL || A[0] < ~(1)))) && A[0] < -1LL && (((A[0] > 4294967295ULL && (((A[0] > 2147483648ULL)) && A[0] >= 4294967295U)) && A[0] < 2147483646ULL && A[0] <= 0L))) && A[0] > 0U && ((A[0] > 552237804 && A[0] > 4294967294UL) && (((A[0] < 0L && (A[0] > -2147483648) && ((((((((A[0] > -2147483647))))) && A[0] >= -2147483648) || (A[0] <= ~(1) && (A[0] >= 4294967295UL))) && A[0] <= 2147483646LL)) && A[0] != 100000) || (A[0] < -1L)) && A[0] != 4294967294U))) && A[0] < 0 && A[0] > ~(1U) && A[0] > -62844098 && A[0] < ~(-2147483647) && A[0] > 0UL && A[0] < 1U && A[0] > 0) && (A[0] < ~(0) && (A[0] > 4294967295UL) && (A[0] < 0UL) && (A[0] > 1ULL && (A[0] > 1UL) && (A[0] > 2056281653) && A[0] < 4294967294UL) && A[0] > 4294967294U && A[0] > 4294967294U && (A[0] > -1) && A[0] <= ~(1U)) && A[0] < 2147483646L && (A[0] > ~(0U) && A[0] > -1LL && (A[0] > ~(2147483647)) && A[0] > -2147483647L && ((A[0] < -2147483648 && (A[0] >= ~(2147483646))))) && A[0] > 4294967295ULL && (A[0] > -2147483648L && (A[0] < ~(1) && A[0] < 2147483646LL) && A[0] > ~(-1)) && ((A[0] < 4294967295UL) || (((A[0] > 4294967295UL && (((A[0] < 0 && ((A[0] < 2147483646ULL) && ((A[0] < 1)))))) && A[0] > ~(0U) && (((A[0] >= -1)) && A[0] > -2147483648)) && A[0] < 2147483646ULL && A[0] != 0L))) && A[0] > 1UL) && A[0] > 4294967294ULL && (A[0] < 2147483646U && A[0] < -2147483647L && A[0] > -1485823147 && A[0] < 1U && A[0] > 1L && (((A[0] < 2147483647ULL && A[0] > 2147483646ULL)))) && A[0] < 4294967294UL && ((A[0] != 2147483647ULL || A[0] > 0))) && (A[0] < ~(1U) && (A[0] < 1ULL && (A[0] > ~(4294967295U) && A[0] > 1U && (A[0] > 2147483646U && A[0] > -1LL && A[0] > ~(1) && A[0] < 2147483646L && A[0] > 1UL && A[0] < 0 && A[0] < -1L && A[0] != ~(1)) && (((((A[0] > -2147483647LL) && A[0] < 1L && (A[0] > -2147483648L) && A[0] < 4294967294ULL && A[0] > -2147483648L)) && A[0] > -82984055 && A[0] > -1 && ((A[0] < 2147483646LL) && A[0] < 2147483646LL) && A[0] < 2147483646UL) && (((A[0] > -2147483647L))) && A[0] < 2147483646 && A[0] < 100000) && A[0] < 1LL && A[0] < ~(2147483648U) && (A[0] >= 1U || A[0] != 2147483647ULL)) && A[0] < 2147483646U && A[0] < 2147483647L) && (A[0] < 4294967294UL && A[0] < 2147483646U && ((A[0] < ~(4294967295U))) && A[0] <= ~(0)) && ((((A[0] < 2147483646ULL && A[0] > -1 && A[0] < ~(2147483648U) && A[0] < 0UL) && A[0] > -2147483647L && A[0] > ~(-1)) && A[0] < 1U && A[0] <= ~(4294967294U)) && A[0] > ~(4294967295U)) && A[0] < 0) && (((A[0] > -390958390)) && (A[0] < 0UL) && (A[0] < ~(2147483648U)) && A[0] <= 4294967294UL) && A[0] >= 0ULL));
/* clang-format on */
return 0;
}
12 changes: 12 additions & 0 deletions regression/cbmc/long_assertion_line_number/test.desc
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
CORE
main.c

^\[main.assertion.1\] line 10 assertion: FAILURE$
^VERIFICATION FAILED$
^EXIT=10$
^SIGNAL=0$
--
^warning: ignoring
--
This test verifies that CBMC correctly reports line numbers for assertions in
very long expressions.
2 changes: 1 addition & 1 deletion src/ansi-c/ansi_c_language.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ bool ansi_c_languaget::parse(

if(!result)
{
ansi_c_parser.set_line_no(0);
ansi_c_parser.set_line_no(1);
ansi_c_parser.set_file(path);
ansi_c_parser.in=&i_preprocessed;
ansi_c_scanner_init(ansi_c_parser);
Expand Down
1 change: 0 additions & 1 deletion src/goto-instrument/contracts/contracts_wrangler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,6 @@ void contracts_wranglert::mangle(
// Parse the fake function.
std::istringstream is(pr.str());
ansi_c_parsert ansi_c_parser{message_handler};
ansi_c_parser.set_line_no(0);
ansi_c_parser.set_file("<predicate>");
ansi_c_parser.in = &is;
ansi_c_parser.for_has_scope = config.ansi_c.for_has_scope;
Expand Down
1 change: 0 additions & 1 deletion src/statement-list/statement_list_language.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,6 @@ bool statement_list_languaget::parse(
{
statement_list_parsert statement_list_parser{message_handler};
parse_path = path;
statement_list_parser.set_line_no(0);
statement_list_parser.set_file(path);
statement_list_parser.in = &instream;
bool result = statement_list_parser.parse();
Expand Down
70 changes: 39 additions & 31 deletions src/util/parser.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,9 +33,10 @@ class parsert
explicit parsert(message_handlert &message_handler)
: in(nullptr),
log(message_handler),
line_no(0),
line_no(1),
previous_line_no(std::numeric_limits<unsigned int>::max()),
column(1)
column(1),
last_input_ended_with_newline(false)
{
}

Expand Down Expand Up @@ -114,12 +115,7 @@ class parsert
if(previous_line_no!=line_no)
{
previous_line_no=line_no;

// for the case of a file with no newlines
if(line_no == 0)
_source_location.set_line(1);
else
_source_location.set_line(line_no);
_source_location.set_line(line_no);
}

return _source_location;
Expand Down Expand Up @@ -150,6 +146,12 @@ class parsert
source_locationt _source_location;
unsigned line_no, previous_line_no;
unsigned column;

public:
// Accessed by YY_INPUT macro; tracks whether the last YY_INPUT call
// ended with a newline so that the line-number increment can be
// deferred to the start of the next call.
bool last_input_ended_with_newline;
};

exprt &_newstack(parsert &parser, unsigned &x);
Expand All @@ -161,29 +163,35 @@ exprt &_newstack(parsert &parser, unsigned &x);
#define stack_type(x) \
(static_cast<typet &>(static_cast<irept &>(PARSER.stack[x])))

#define YY_INPUT(buf, result, max_size) \
do { \
for(result=0; result<max_size;) \
{ \
char ch; \
if(!PARSER.read(ch)) /* NOLINT(readability/braces) */ \
{ \
if(result==0) \
result=YY_NULL; \
break; \
} \
\
if(ch!='\r') /* NOLINT(readability/braces) */ \
{ \
buf[result++]=ch; \
if(ch=='\n') /* NOLINT(readability/braces) */ \
{ \
PARSER.inc_line_no(); \
break; \
} \
} \
} \
} while(0)
#define YY_INPUT(buf, result, max_size) \
do \
{ \
if(PARSER.last_input_ended_with_newline) /* NOLINT(readability/braces) */ \
{ \
PARSER.inc_line_no(); \
PARSER.last_input_ended_with_newline = false; \
} \
for(result = 0; result < max_size;) \
{ \
char ch; \
if(!PARSER.read(ch)) /* NOLINT(readability/braces) */ \
{ \
if(result == 0) \
result = YY_NULL; \
break; \
} \
\
if(ch != '\r') /* NOLINT(readability/braces) */ \
{ \
buf[result++] = ch; \
if(ch == '\n') /* NOLINT(readability/braces) */ \
{ \
PARSER.last_input_ended_with_newline = true; \
break; \
} \
} \
} \
} while(0)

// The following tracks the column of the token, and is nicely explained here:
// http://oreilly.com/linux/excerpts/9780596155971/error-reporting-recovery.html
Expand Down
Loading