mirror of
https://gitlab.com/embeddable-common-lisp/ecl.git
synced 2026-01-23 04:52:42 -08:00
Coverity fix issue
Proper cleanup of vararg. Fix buffer corruption on dpp.
This commit is contained in:
parent
a095f6a4ee
commit
d73cc5013b
2 changed files with 40 additions and 20 deletions
|
|
@ -240,22 +240,22 @@ ecl_char_cmp(cl_object x, cl_object y)
|
||||||
|
|
||||||
@(defun char< (&rest args)
|
@(defun char< (&rest args)
|
||||||
@
|
@
|
||||||
return Lchar_cmp(the_env, narg, 1, 1, args);
|
@(return Lchar_cmp(the_env, narg, 1, 1, args));
|
||||||
@)
|
@)
|
||||||
|
|
||||||
@(defun char> (&rest args)
|
@(defun char> (&rest args)
|
||||||
@
|
@
|
||||||
return Lchar_cmp(the_env, narg,-1, 1, args);
|
@(return Lchar_cmp(the_env, narg,-1, 1, args));
|
||||||
@)
|
@)
|
||||||
|
|
||||||
@(defun char<= (&rest args)
|
@(defun char<= (&rest args)
|
||||||
@
|
@
|
||||||
return Lchar_cmp(the_env, narg, 1, 0, args);
|
@(return Lchar_cmp(the_env, narg, 1, 0, args));
|
||||||
@)
|
@)
|
||||||
|
|
||||||
@(defun char>= (&rest args)
|
@(defun char>= (&rest args)
|
||||||
@
|
@
|
||||||
return Lchar_cmp(the_env, narg,-1, 0, args);
|
@(return Lchar_cmp(the_env, narg,-1, 0, args));
|
||||||
@)
|
@)
|
||||||
|
|
||||||
@(defun char_equal (c &rest cs)
|
@(defun char_equal (c &rest cs)
|
||||||
|
|
@ -331,22 +331,22 @@ ecl_char_compare(cl_object x, cl_object y)
|
||||||
|
|
||||||
@(defun char-lessp (&rest args)
|
@(defun char-lessp (&rest args)
|
||||||
@
|
@
|
||||||
return Lchar_compare(the_env, narg, 1, 1, args);
|
@(return Lchar_compare(the_env, narg, 1, 1, args));
|
||||||
@)
|
@)
|
||||||
|
|
||||||
@(defun char-greaterp (&rest args)
|
@(defun char-greaterp (&rest args)
|
||||||
@
|
@
|
||||||
return Lchar_compare(the_env, narg,-1, 1, args);
|
@(return Lchar_compare(the_env, narg,-1, 1, args));
|
||||||
@)
|
@)
|
||||||
|
|
||||||
@(defun char-not-greaterp (&rest args)
|
@(defun char-not-greaterp (&rest args)
|
||||||
@
|
@
|
||||||
return Lchar_compare(the_env, narg, 1, 0, args);
|
@(return Lchar_compare(the_env, narg, 1, 0, args));
|
||||||
@)
|
@)
|
||||||
|
|
||||||
@(defun char-not-lessp (&rest args)
|
@(defun char-not-lessp (&rest args)
|
||||||
@
|
@
|
||||||
return Lchar_compare(the_env, narg,-1, 0, args);
|
@(return Lchar_compare(the_env, narg,-1, 0, args));
|
||||||
@)
|
@)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
44
src/c/dpp.c
44
src/c/dpp.c
|
|
@ -120,6 +120,11 @@ char *required[MAXREQ];
|
||||||
int nreq;
|
int nreq;
|
||||||
|
|
||||||
int the_env_defined = 0;
|
int the_env_defined = 0;
|
||||||
|
enum vararg_status_t {
|
||||||
|
VARARG_NOT_DEFINED,
|
||||||
|
VARARG_SIMPLE,
|
||||||
|
VARARG_ECL};
|
||||||
|
enum vararg_status_t vararg_status = VARARG_NOT_DEFINED;
|
||||||
|
|
||||||
struct optional {
|
struct optional {
|
||||||
char *o_var;
|
char *o_var;
|
||||||
|
|
@ -470,6 +475,7 @@ reset(void)
|
||||||
aux[i].a_var
|
aux[i].a_var
|
||||||
= aux[i].a_init
|
= aux[i].a_init
|
||||||
= NULL;
|
= NULL;
|
||||||
|
vararg_status = VARARG_NOT_DEFINED;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
@ -726,13 +732,16 @@ put_declaration(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
put_lineno();
|
put_lineno();
|
||||||
if (simple_varargs)
|
if (simple_varargs) {
|
||||||
|
vararg_status = VARARG_SIMPLE;
|
||||||
fprintf(out,"\tva_list %s;\n\tva_start(%s, %s);\n",
|
fprintf(out,"\tva_list %s;\n\tva_start(%s, %s);\n",
|
||||||
rest_var, rest_var, ((nreq > 0) ? required[nreq-1] : "narg"));
|
rest_var, rest_var, ((nreq > 0) ? required[nreq-1] : "narg"));
|
||||||
else
|
} else {
|
||||||
|
vararg_status = VARARG_ECL;
|
||||||
fprintf(out,"\tecl_va_list %s;\n\tecl_va_start(%s, %s, narg, %d);\n",
|
fprintf(out,"\tecl_va_list %s;\n\tecl_va_start(%s, %s, narg, %d);\n",
|
||||||
rest_var, rest_var, ((nreq > 0) ? required[nreq-1] : "narg"),
|
rest_var, rest_var, ((nreq > 0) ? required[nreq-1] : "narg"),
|
||||||
nreq);
|
nreq);
|
||||||
|
}
|
||||||
put_lineno();
|
put_lineno();
|
||||||
fprintf(out, "\tif (ecl_unlikely(narg < %d", nreq);
|
fprintf(out, "\tif (ecl_unlikely(narg < %d", nreq);
|
||||||
if (nopt > 0 && !rest_flag && !key_flag) {
|
if (nopt > 0 && !rest_flag && !key_flag) {
|
||||||
|
|
@ -764,11 +773,6 @@ put_declaration(void)
|
||||||
put_lineno();
|
put_lineno();
|
||||||
fprintf(out, "\t}\n");
|
fprintf(out, "\t}\n");
|
||||||
}
|
}
|
||||||
if (simple_varargs) {
|
|
||||||
fprintf(out,"\tva_end(%s);\n", rest_var);
|
|
||||||
} else {
|
|
||||||
fprintf(out,"\tecl_va_end(%s);\n", rest_var);
|
|
||||||
}
|
|
||||||
if (key_flag) {
|
if (key_flag) {
|
||||||
put_lineno();
|
put_lineno();
|
||||||
fprintf(out, "\tcl_parse_key(ARGS, %d, KEYS, KEY_VARS, NULL, %d);\n",
|
fprintf(out, "\tcl_parse_key(ARGS, %d, KEYS, KEY_VARS, NULL, %d);\n",
|
||||||
|
|
@ -804,6 +808,16 @@ put_declaration(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void unregister_varargs()
|
||||||
|
{
|
||||||
|
if (vararg_status == VARARG_SIMPLE) {
|
||||||
|
fprintf(out, "va_end(%s);\n", rest_var);
|
||||||
|
}
|
||||||
|
else if (vararg_status == VARARG_ECL) {
|
||||||
|
fprintf(out, "ecl_va_end(%s);\n", rest_var);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
put_return(void)
|
put_return(void)
|
||||||
{
|
{
|
||||||
|
|
@ -831,6 +845,8 @@ put_return(void)
|
||||||
fprintf(out, "the_env->values[%d] = __value%d;\n", i, i);
|
fprintf(out, "the_env->values[%d] = __value%d;\n", i, i);
|
||||||
}
|
}
|
||||||
put_tabs(t);
|
put_tabs(t);
|
||||||
|
unregister_varargs();
|
||||||
|
put_tabs(t);
|
||||||
fprintf(out, "return __value0;\n");
|
fprintf(out, "return __value0;\n");
|
||||||
}
|
}
|
||||||
put_tabs(tab_save);
|
put_tabs(tab_save);
|
||||||
|
|
@ -873,24 +889,28 @@ main_loop(void)
|
||||||
goto LOOP;
|
goto LOOP;
|
||||||
} else if (c == '\'') {
|
} else if (c == '\'') {
|
||||||
char *p;
|
char *p;
|
||||||
poolp = pool;
|
char* tmp = poolp;
|
||||||
p = read_symbol(0);
|
p = read_symbol(0);
|
||||||
pushc('\0');
|
pushc('\0');
|
||||||
fprintf(out,"%s",p);
|
fprintf(out,"%s",p);
|
||||||
|
poolp = tmp;
|
||||||
goto LOOP;
|
goto LOOP;
|
||||||
} else if (c == '[') {
|
} else if (c == '[') {
|
||||||
char *p;
|
char *p;
|
||||||
poolp = pool;
|
char * tmp = poolp;
|
||||||
p = read_symbol(1);
|
p = read_symbol(1);
|
||||||
pushc('\0');
|
pushc('\0');
|
||||||
fprintf(out,"%s",p);
|
fprintf(out,"%s",p);
|
||||||
|
poolp = tmp;
|
||||||
goto LOOP;
|
goto LOOP;
|
||||||
} else if (c != '(') {
|
} else if (c != '(') {
|
||||||
char *p;
|
char *p;
|
||||||
|
char * tmp = poolp;
|
||||||
unreadc(c);
|
unreadc(c);
|
||||||
poolp = pool;
|
//poolp = pool;
|
||||||
poolp = p = read_function();
|
p = read_function();
|
||||||
fprintf(out,"%s",translate_function(poolp));
|
fprintf(out,"%s",translate_function(p));
|
||||||
|
poolp = tmp;
|
||||||
goto LOOP;
|
goto LOOP;
|
||||||
}
|
}
|
||||||
p = read_token();
|
p = read_token();
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue