Skip to content

Commit 9c7b03c

Browse files
authored
Merge pull request #6819 from tautschnig/cleanup/argv-envp-index
C front-end: use proper index type for argv and envp access
2 parents 94b81b2 + 7f0f486 commit 9c7b03c

File tree

1 file changed

+15
-6
lines changed

1 file changed

+15
-6
lines changed

src/ansi-c/ansi_c_entry_point.cpp

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -302,6 +302,7 @@ bool generate_ansi_c_start_function(
302302
}
303303

304304
const symbolt &argv_symbol=ns.lookup("argv'");
305+
const array_typet &argv_array_type = to_array_type(argv_symbol.type);
305306

306307
{
307308
// Assume argc is at least zero. Note that we don't assume it's
@@ -405,10 +406,12 @@ bool generate_ansi_c_start_function(
405406
{
406407
// assign argv[argc] to NULL
407408
const null_pointer_exprt null(
408-
to_pointer_type(to_array_type(argv_symbol.type).element_type()));
409+
to_pointer_type(argv_array_type.element_type()));
409410

410411
index_exprt index_expr(
411-
argv_symbol.symbol_expr(), argc_symbol.symbol_expr());
412+
argv_symbol.symbol_expr(),
413+
typecast_exprt::conditional_cast(
414+
argc_symbol.symbol_expr(), argv_array_type.index_type()));
412415

413416
init_code.add(code_frontend_assignt(index_expr, null));
414417
// disable bounds check on that one
@@ -419,14 +422,17 @@ bool generate_ansi_c_start_function(
419422
if(parameters.size()==3)
420423
{
421424
const symbolt &envp_symbol=ns.lookup("envp'");
425+
const array_typet &envp_array_type = to_array_type(envp_symbol.type);
422426
const symbolt &envp_size_symbol=ns.lookup("envp_size'");
423427

424428
// assume envp[envp_size] is NULL
425429
null_pointer_exprt null(
426-
to_pointer_type(to_array_type(envp_symbol.type).element_type()));
430+
to_pointer_type(envp_array_type.element_type()));
427431

428432
index_exprt index_expr(
429-
envp_symbol.symbol_expr(), envp_size_symbol.symbol_expr());
433+
envp_symbol.symbol_expr(),
434+
typecast_exprt::conditional_cast(
435+
envp_size_symbol.symbol_expr(), envp_array_type.index_type()));
430436

431437
equal_exprt is_null(std::move(index_expr), std::move(null));
432438

@@ -452,7 +458,8 @@ bool generate_ansi_c_start_function(
452458

453459
{
454460
index_exprt index_expr(
455-
argv_symbol.symbol_expr(), from_integer(0, c_index_type()));
461+
argv_symbol.symbol_expr(),
462+
from_integer(0, argv_array_type.index_type()));
456463
// disable bounds check on that one
457464
index_expr.add_source_location().add_pragma("disable:bounds-check");
458465

@@ -467,9 +474,11 @@ bool generate_ansi_c_start_function(
467474
if(parameters.size()==3)
468475
{
469476
const symbolt &envp_symbol=ns.lookup("envp'");
477+
const array_typet &envp_array_type = to_array_type(envp_symbol.type);
470478

471479
index_exprt index_expr(
472-
envp_symbol.symbol_expr(), from_integer(0, c_index_type()));
480+
envp_symbol.symbol_expr(),
481+
from_integer(0, envp_array_type.index_type()));
473482

474483
const pointer_typet &pointer_type =
475484
to_pointer_type(parameters[2].type());

0 commit comments

Comments
 (0)