Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

builtin.c: typecheck builtin cfunctions in function_list #3209

Merged
merged 2 commits into from
Dec 1, 2024

Commits on Nov 25, 2024

  1. builtin.c: typecheck builtin cfunctions in function_list

    In C23 (default C standard used by GCC 15),  jv (*fptr)();  has become
    equivalent to  jv (*fptr)(void);  so we can no longer assign builtin
    implemenations directly to the fptr member of cfunctions without
    generating a compile error.
    
    Since there does not seem to be any straight-forward way to tell
    autoconf to force the compiler to use C99 short of explicitly adding
    -std=c99 to CFLAGS, it is probably a cleaner solution to just make the
    code C23 compatible.
    
    A possible solution could have been to just redeclare  cfunction.fptr
    as void*, but then the functions' return type would not have been type
    checked (e.g. if you tried to add a {printf, "printf", 2}, where printf
    is a function that does not return jv, the compiler wouldn't have
    complained.)
    We were already not typechecking the arguments of the functions, so e.g.
      {binop_plus, "_plus", 3},  /* instead of {f_plus, "_plus, 3},       */
      {f_setpath, "setpath", 4}, /* instead of {f_setpath, "setpath", 3}, */
    compile without errors despite not having the correct prototype.
    
    So I thought of instead improving the situation by redefining
    cfunction.fptr as a union of function pointers with the prototypes that
    the jq bytecode interpreter can call, and use a macro to add the builtin
    functions to function_list using to the arity argument to assign the
    implementation function to the appropriate union member.
    
    Now the code won't compile if the wrong arity, or an arity not supported
    by the bytecode interpreter (>5 = 1input+4arguments), or a prototype not
    jallable by the bytecode interpreter (e.g. binop_plus that doesn't
    expect a  jq_state*  argument).
    
    Also, the code now compiles with gcc -std=c23.
    
    Fixes jqlang#3206
    emanuele6 committed Nov 25, 2024
    Configuration menu
    Copy the full SHA
    750ef29 View commit details
    Browse the repository at this point in the history

Commits on Nov 26, 2024

  1. Configuration menu
    Copy the full SHA
    ab3173a View commit details
    Browse the repository at this point in the history