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-functionhttps://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-functionhttps://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. ***