Bug 22831 – No error for malformed extern(C) main function

Status
RESOLVED
Resolution
FIXED
Severity
normal
Priority
P1
Component
dmd
Product
D
Version
D2
Platform
All
OS
All
Creation time
2022-03-01T17:22:27Z
Last change time
2022-04-13T12:29:31Z
Keywords
pull
Assigned to
No Owner
Creator
moonlightsentinel

Comments

Comment #0 by moonlightsentinel — 2022-03-01T17:22:27Z
DMD silently accepts extern(C) main functions with arbitrary arguments / return type. The spec[1] exlicitly requires one of the following forms: extern (C) int main() { ... } extern (C) int main(int argc, char** argv) { ... } [1] https://dlang.org/spec/function.html#betterc-main
Comment #1 by snarwin+bugzilla — 2022-03-01T17:50:45Z
Note that on some platforms there are other possible signatures for main; e.g., extern (C) int main(int argc, char** argv, char** envp) { ... }
Comment #2 by dlang-bot — 2022-03-03T11:17:40Z
@MoonlightSentinel created dlang/dmd pull request #13749 "Fix 22831 - Check signature of extern(C) main functions" fixing this issue: - Fix 22831 - Check signature of extern(C) main functions Enforce that the `main` function uses (most likely) valid arguments / return types. The spec / C standard denotes the following signatures: ```d int main() { ... } int main(int, char**) { ... } ``` The implemented checks are more lenient to accomodate for common deviations from the standards. See the DDOC comment of `checkMain()` for a list of accepted extensions. Exotic platforms that expect a different signature can circumvent the checks using `pragma(mangle, "main")`. See e.g. https://stackoverflow.com/questions/2108192/what-are-the-valid-signatures-for-cs-main-function https://github.com/dlang/dmd/pull/13749
Comment #3 by dlang-bot — 2022-03-23T12:41:10Z
dlang/dmd pull request #13749 "Fix 22831 - Check signature of extern(C) main functions" was merged into master: - 118e246c5162e81cd49a8a785ebe0cec9957f360 by MoonlightSentinel: Fix 22831 - Check signature of extern(C) main functions Enforce that the `main` function uses (most likely) valid arguments / return types. The spec / C standard denotes the following signatures: ```d int main() { ... } int main(int, char**) { ... } ``` The implemented checks are more lenient to accomodate for common deviations from the standards. See the DDOC comment of `checkMain()` for a list of accepted extensions. Exotic platforms that expect a different signature can circumvent the checks using `pragma(mangle, "main")`. See e.g. https://stackoverflow.com/questions/2108192/what-are-the-valid-signatures-for-cs-main-function https://github.com/dlang/dmd/pull/13749
Comment #4 by moonlightsentinel — 2022-03-29T18:34:01Z
*** Issue 20377 has been marked as a duplicate of this issue. ***
Comment #5 by dkorpel — 2022-04-13T12:29:31Z
*** Issue 21503 has been marked as a duplicate of this issue. ***