mirror of
https://gitlab.com/embeddable-common-lisp/ecl.git
synced 2026-01-22 20:42:03 -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)
|
||||
@
|
||||
return Lchar_cmp(the_env, narg, 1, 1, args);
|
||||
@(return Lchar_cmp(the_env, narg, 1, 1, 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)
|
||||
@
|
||||
return Lchar_cmp(the_env, narg, 1, 0, args);
|
||||
@(return Lchar_cmp(the_env, narg, 1, 0, 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)
|
||||
|
|
@ -331,22 +331,22 @@ ecl_char_compare(cl_object x, cl_object y)
|
|||
|
||||
@(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)
|
||||
@
|
||||
return Lchar_compare(the_env, narg,-1, 1, args);
|
||||
@(return Lchar_compare(the_env, narg,-1, 1, 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)
|
||||
@
|
||||
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 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 {
|
||||
char *o_var;
|
||||
|
|
@ -470,6 +475,7 @@ reset(void)
|
|||
aux[i].a_var
|
||||
= aux[i].a_init
|
||||
= NULL;
|
||||
vararg_status = VARARG_NOT_DEFINED;
|
||||
}
|
||||
|
||||
void
|
||||
|
|
@ -726,13 +732,16 @@ put_declaration(void)
|
|||
}
|
||||
}
|
||||
put_lineno();
|
||||
if (simple_varargs)
|
||||
if (simple_varargs) {
|
||||
vararg_status = VARARG_SIMPLE;
|
||||
fprintf(out,"\tva_list %s;\n\tva_start(%s, %s);\n",
|
||||
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",
|
||||
rest_var, rest_var, ((nreq > 0) ? required[nreq-1] : "narg"),
|
||||
nreq);
|
||||
}
|
||||
put_lineno();
|
||||
fprintf(out, "\tif (ecl_unlikely(narg < %d", nreq);
|
||||
if (nopt > 0 && !rest_flag && !key_flag) {
|
||||
|
|
@ -764,11 +773,6 @@ put_declaration(void)
|
|||
put_lineno();
|
||||
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) {
|
||||
put_lineno();
|
||||
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
|
||||
put_return(void)
|
||||
{
|
||||
|
|
@ -831,6 +845,8 @@ put_return(void)
|
|||
fprintf(out, "the_env->values[%d] = __value%d;\n", i, i);
|
||||
}
|
||||
put_tabs(t);
|
||||
unregister_varargs();
|
||||
put_tabs(t);
|
||||
fprintf(out, "return __value0;\n");
|
||||
}
|
||||
put_tabs(tab_save);
|
||||
|
|
@ -873,24 +889,28 @@ main_loop(void)
|
|||
goto LOOP;
|
||||
} else if (c == '\'') {
|
||||
char *p;
|
||||
poolp = pool;
|
||||
char* tmp = poolp;
|
||||
p = read_symbol(0);
|
||||
pushc('\0');
|
||||
fprintf(out,"%s",p);
|
||||
poolp = tmp;
|
||||
goto LOOP;
|
||||
} else if (c == '[') {
|
||||
char *p;
|
||||
poolp = pool;
|
||||
char * tmp = poolp;
|
||||
p = read_symbol(1);
|
||||
pushc('\0');
|
||||
fprintf(out,"%s",p);
|
||||
poolp = tmp;
|
||||
goto LOOP;
|
||||
} else if (c != '(') {
|
||||
char *p;
|
||||
char * tmp = poolp;
|
||||
unreadc(c);
|
||||
poolp = pool;
|
||||
poolp = p = read_function();
|
||||
fprintf(out,"%s",translate_function(poolp));
|
||||
//poolp = pool;
|
||||
p = read_function();
|
||||
fprintf(out,"%s",translate_function(p));
|
||||
poolp = tmp;
|
||||
goto LOOP;
|
||||
}
|
||||
p = read_token();
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue