D issues are now tracked on GitHub. This Bugzilla instance remains as a read-only archive.
Issue 18375 - std.getopt uses deprecated rwm operations for shared variables
Summary: std.getopt uses deprecated rwm operations for shared variables
Status: NEW
Alias: None
Product: D
Classification: Unclassified
Component: dmd (show other issues)
Version: D2
Hardware: x86_64 All
: P3 normal
Assignee: No Owner
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2018-02-05 12:57 UTC by Seb
Modified: 2024-12-13 18:56 UTC (History)
1 user (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this issue.
Description Seb 2018-02-05 12:57:36 UTC
---
shared real v;
shared string s;
auto args = ["program.name", "-v=2", "-s=bar"];
---
Comment 1 Seb 2018-02-05 13:33:24 UTC
std.getopt test cases:

1) Passing and "just" triggering deprecation warnings


---
@system unittest
{
    shared real v;
    shared uint i;
    shared string[] arrString;
    shared int[] arrInt;

    auto args = ["program.name",
        "-v=2",
        "-i=10",
        "--arrString=a", "--arrString=b",
        "--arrInt=1", "--arrInt=2",
    ];
    getopt(args,
        "v", &v,
        "i", &i,
        "arrString", &arrString,
        "arrInt", &arrInt,
    );
    assert(v == 2);
    assert(i == 10);

    shared expectedArrString = ["a", "b"];
    assert(arrString == expectedArrString);
    shared expectedArrInt = [1, 2];
    assert(arrInt == expectedArrInt);
}
---

2) Completely failing

---
@system unittest
{
    shared string s;
    shared bool b;
    shared string[string] assocArrayString;
    shared double[string] assocArrayDouble;

    auto args = ["program.name",
        "-s=bar",
        "-b",
        "--assocArrayString=foo=bar,bar=1",
        "--assocArrayDouble=foo=1,bar=2",
    ];
    getopt(args,
        "s", &s,
        "b", &b,
        "assocArrayString", &assocArrayString,
        "assocArrayDouble", &assocArrayDouble,
    );

    assert(s == "bar");
    assert(b == 1);

    shared expectedAssocArrayString = ["foo": "bar", "bar": "1"];
    assert(assocArrayString == expectedAssocArrayString);
    shared expectedAssocArrayDouble = ["foo":1.0, "bar": 2];
    assert(assocArrayDouble == expectedAssocArrayDouble);
}
---
Comment 2 ZombineDev 2018-02-05 17:23:25 UTC
All of these examples should *never* compile. The whole point of `shared` is to statically disallow accidental access shared mutable state. > 90% of all functions in phobos have no business touching `shared`/`__gshared` variables, especially `std.getopt`.

`std.getopt` can be safely used to set:
* function local variables
* (static) thread-local variables
* immutable global variables from shared static constructors (not sure if this currently works, but it should be ok from memory model perspective)

I consider everything else to potentially trigger undefined behavior.
Comment 3 Seb 2018-02-05 17:56:47 UTC
>  immutable global variables from shared static constructors (not sure if this currently works, but it should be ok from memory model perspective)

No this doesn't work at the moment.


For future readers: it has been used by people before (https://github.com/vibe-d/vibe.d/pull/2060).
Comment 4 dlangBugzillaToGithub 2024-12-13 18:56:43 UTC
THIS ISSUE HAS BEEN MOVED TO GITHUB

https://github.com/dlang/dmd/issues/19379

DO NOT COMMENT HERE ANYMORE, NOBODY WILL SEE IT, THIS ISSUE HAS BEEN MOVED TO GITHUB