From 40007126fa9feb885472aa155d9f4a541c71723e Mon Sep 17 00:00:00 2001 From: Ilmir Usmanov Date: Fri, 25 Jul 2014 14:16:29 +0400 Subject: [PATCH] Fix memory corruptions in lexer, which occured while parsing cse.js; remove lexer.log and parser.log files --- .gitignore | 1 + Makefile.mak | 2 +- src/libjsparser/lexer.c | 21 +---------------- src/libjsparser/parser.c | 13 +++-------- src/libruntime/serializer.h | 5 +++-- src/libruntime/target/linux/serializer.c | 26 +++++++++++----------- src/libruntime/target/stm32f4/serializer.c | 8 +++---- 7 files changed, 26 insertions(+), 50 deletions(-) diff --git a/.gitignore b/.gitignore index def6aaec1..943b34f6a 100644 --- a/.gitignore +++ b/.gitignore @@ -22,6 +22,7 @@ nbproject *~ js.files core +vgcore.* **.orig # ctags and ID database diff --git a/Makefile.mak b/Makefile.mak index b5ff5524a..d0d07e9a5 100644 --- a/Makefile.mak +++ b/Makefile.mak @@ -143,7 +143,7 @@ endif # CFLAGS_JERRY = $(CFLAGS_WARNINGS) $(CFLAGS_WERROR) -DEFINES_JERRY = -DMEM_HEAP_CHUNK_SIZE=256 -DMEM_HEAP_AREA_SIZE=32768 -DMEM_STATS +DEFINES_JERRY = -DMEM_HEAP_CHUNK_SIZE=$$((256)) -DMEM_HEAP_AREA_SIZE=$$((32768)) -DMEM_STATS # FIXME: # Add common-io.c and sensors.c diff --git a/src/libjsparser/lexer.c b/src/libjsparser/lexer.c index 9ea3d73f2..587f1413c 100644 --- a/src/libjsparser/lexer.c +++ b/src/libjsparser/lexer.c @@ -88,7 +88,7 @@ num_and_token; #define MAX_NAMES 100 #define MAX_NUMS 25 -static string_and_token seen_names[MAX_NUMS]; +static string_and_token seen_names[MAX_NAMES]; static uint8_t seen_names_count = 0; static num_and_token seen_nums[MAX_NAMES] = @@ -112,7 +112,6 @@ static const char *token_start; #define LA(I) (*(buffer + I)) #ifdef __HOST -_FILE *lexer_debug_log; static void dump_current_line (void) @@ -816,10 +815,6 @@ lexer_next_token_private (void) parser_fatal (ERR_NON_CHAR); } -#ifdef __HOST -static int i = 0; -#endif /* __HOST */ - token lexer_next_token (void) { @@ -836,12 +831,6 @@ lexer_next_token (void) dump_current_line (); return tok; } - if (tok.type == TOK_CLOSE_BRACE) - { - // if (i == 300) - __fprintf (lexer_debug_log, "lexer_next_token(%d): type=%d, data=%d\n", i, tok.type, tok.data.uid); - i++; - } #endif /* __HOST */ return tok; } @@ -849,10 +838,6 @@ lexer_next_token (void) void lexer_save_token (token tok) { -#ifdef __HOST - if (tok.type == TOK_CLOSE_BRACE) - __fprintf (lexer_debug_log, "lexer_save_token(%d): type=%d, data=%d\n", i, tok.type, tok.data.uid); -#endif /* __HOST */ saved_token = tok; } @@ -867,10 +852,6 @@ lexer_init( const char *source) { saved_token = empty_token; lexer_set_source( source); - -#ifdef __HOST - lexer_debug_log = __fopen ("lexer.log", "w"); -#endif /* __HOST */ } void diff --git a/src/libjsparser/parser.c b/src/libjsparser/parser.c index 10f625ca5..92486792d 100644 --- a/src/libjsparser/parser.c +++ b/src/libjsparser/parser.c @@ -27,10 +27,6 @@ static OPCODE opcode; static T_IDX opcode_counter = 0; static T_IDX temp_name_stack[MAX_OPCODES], temp_name_stack_head = 0, max_temp_name; -#ifdef __HOST -_FILE *debug_file; -#endif - static T_IDX parse_expression (void); static void parse_statement (void); static T_IDX parse_assignment_expression (void); @@ -147,13 +143,13 @@ insert_semicolon (void) do { skip_newlines (); ID = parse_##TYPE (); } while (0) #define DUMP_VOID_OPCODE(GETOP) \ - do { opcode=getop_##GETOP (); serializer_dump_opcode (&opcode); opcode_counter++; } while (0) + do { opcode=getop_##GETOP (); serializer_dump_opcode (opcode); opcode_counter++; } while (0) #define DUMP_OPCODE(GETOP, ...) \ - do { opcode=getop_##GETOP (__VA_ARGS__); serializer_dump_opcode (&opcode); opcode_counter++; } while (0) + do { opcode=getop_##GETOP (__VA_ARGS__); serializer_dump_opcode (opcode); opcode_counter++; } while (0) #define REWRITE_OPCODE(OC, GETOP, ...) \ - do { opcode=getop_##GETOP (__VA_ARGS__); serializer_rewrite_opcode (OC, &opcode); } while (0) + do { opcode=getop_##GETOP (__VA_ARGS__); serializer_rewrite_opcode (OC, opcode); } while (0) static T_IDX integer_zero (void) @@ -1835,9 +1831,6 @@ void parser_init (void) { max_temp_name = temp_name = min_temp_name = lexer_get_reserved_ids_count (); -#ifdef __HOST - debug_file = __fopen ("parser.log", "w"); -#endif } void diff --git a/src/libruntime/serializer.h b/src/libruntime/serializer.h index ac21f992c..f437ce1a1 100644 --- a/src/libruntime/serializer.h +++ b/src/libruntime/serializer.h @@ -17,6 +17,7 @@ #define SERIALIZER_H #include "globals.h" +#include "opcodes.h" void serializer_init (void); @@ -24,9 +25,9 @@ uint8_t serializer_dump_strings (const char **, uint8_t); void serializer_dump_nums (const int32_t *, uint8_t, uint8_t, uint8_t); -void serializer_dump_opcode (const void *); +void serializer_dump_opcode (OPCODE); -void serializer_rewrite_opcode (const uint8_t, const void *); +void serializer_rewrite_opcode (const uint8_t, OPCODE); void serializer_print_opcodes (void); diff --git a/src/libruntime/target/linux/serializer.c b/src/libruntime/target/linux/serializer.c index 7f997e136..85d04b9be 100644 --- a/src/libruntime/target/linux/serializer.c +++ b/src/libruntime/target/linux/serializer.c @@ -116,32 +116,32 @@ serializer_dump_nums (const int32_t nums[], uint8_t size, uint8_t offset, uint8_ #endif } -static int opcode_counter = 0; +static int32_t opcode_counter = 0; void -serializer_dump_opcode (const void *opcode) +serializer_dump_opcode (OPCODE opcode) { uint8_t i; - int opcode_num = (int)((char*)opcode)[0]; + uint8_t opcode_num = opcode.op_idx; - bytecode_opcodes[opcode_counter] = *((OPCODE*)opcode); + bytecode_opcodes[opcode_counter] = opcode; __printf ("%03d: %20s ", opcode_counter++, opcode_names[opcode_num]); for (i = 1; i < opcode_sizes[opcode_num]; i++) - __printf ("%4d ", ((char*)opcode)[i]); + __printf ("%4d ", ((uint8_t*)&opcode)[i]); __printf ("\n"); } void -serializer_rewrite_opcode (const uint8_t loc, const void *opcode) +serializer_rewrite_opcode (const uint8_t loc, OPCODE opcode) { uint8_t i; - int opcode_num = (int)((char*)opcode)[0]; + uint8_t opcode_num = opcode.op_idx; - bytecode_opcodes[loc] = *((OPCODE*)opcode); + bytecode_opcodes[loc] = opcode; __printf ("%03d: %20s ", loc, opcode_names[opcode_num]); for (i = 1; i < opcode_sizes[opcode_num]; i++) - __printf ("%4d ", ((char*)opcode)[i]); + __printf ("%4d ", ((uint8_t*)&opcode)[i]); __printf ("// REWRITE\n"); } @@ -149,9 +149,9 @@ serializer_rewrite_opcode (const uint8_t loc, const void *opcode) void serializer_print_opcodes (void) { - int loc = -1, i; + int32_t loc = -1, i; OPCODE* opcode; - int opcode_num; + uint8_t opcode_num; __printf ("AFTER OPTIMIZER:\n"); @@ -160,11 +160,11 @@ serializer_print_opcodes (void) loc++; opcode = bytecode_opcodes + loc; - opcode_num = (int)((char*)opcode)[0]; + opcode_num = opcode->op_idx; __printf ("%03d: %20s ", loc, opcode_names[opcode_num]); for (i = 1; i < opcode_sizes[opcode_num]; i++) - __printf ("%4d ", ((char*)opcode)[i]); + __printf ("%4d ", ((uint8_t*)opcode)[i]); __printf ("\n"); } while (opcode->op_idx != __op__idx_exitval); diff --git a/src/libruntime/target/stm32f4/serializer.c b/src/libruntime/target/stm32f4/serializer.c index 33986ab3f..5a0ba8af2 100644 --- a/src/libruntime/target/stm32f4/serializer.c +++ b/src/libruntime/target/stm32f4/serializer.c @@ -94,15 +94,15 @@ serializer_dump_nums (const int32_t nums[], uint8_t size, uint8_t offset, uint8_ static int opcode_counter = 0; void -serializer_dump_opcode (const void *opcode) +serializer_dump_opcode (OPCODE opcode) { - bytecode_opcodes[opcode_counter++] = *((OPCODE*)opcode); + bytecode_opcodes[opcode_counter++] = opcode; } void -serializer_rewrite_opcode (const uint8_t loc, const void *opcode) +serializer_rewrite_opcode (const uint8_t loc, OPCODE opcode) { - bytecode_opcodes[loc] = *((OPCODE*)opcode); + bytecode_opcodes[loc] = opcode; } void