Why does this simple program segfault?

Ary Manzana ary at esperanto.org.ar
Tue Aug 14 20:44:16 PDT 2007


Bill Baxter escribió:
> Ary Manzana wrote:
>> Bill Baxter escribió:
>>> BCS wrote:
>>>> Reply to convert,
>>>>
>>>>> Hi,
>>>>>
>>>>> I wrote this very simple class, but the call to fun.testIt()
>>>>> segfaults.
>>>>> If I put the function outside of the class it works just fine.
>>>>> What am I missing?
>>>>> I have tried this with dmd v1.015 and the tango dmd v1.018, same
>>>>> thing.
>>>>> Thank you very much.
>>>>>
>>>>> -------------------
>>>>> import std.stdio;
>>>>> class Tester
>>>>> {
>>>>> void testIt() {}
>>>>> }
>>>>> void main()
>>>>> {
>>>>> Tester fun;
>>
>> The compiler should do the following:
>>
>> Since fun wasn't assigned to something, any access to it before an 
>> assignment to fun should result in a compiler error.
>>
>>>>> fun.testIt();
>>>>> writefln("I made it!");
>>>>> }
>>>>
>>>> you don't new the Tester
>>>>
>>>>> Tester fun = new Tester();
>>>>
>>>>
>>>
>>> Isn't there something we can do about this?  I do this about once a 
>>> day when in a heavy D using phase.  It bites newbies and 
>>> not-so-newbies alike.  I almost think it should be made so that no 
>>> initializer calls the default constructor, and if you really want it 
>>> to be null then you should initialize with null:
>>>
>>>    Tester fun;  // creates a new Tester
>>>    Tester nofun = null;  // doesn't create anything
>>>
>>> But then there's all sorts of questions that crop up, like what 
>>> should "new Tester[5]" do?  Or "Tester m_fun;" as a class/struct member.
>>
>> Any access to Tester[i] before Tester[i] is assigned something should 
>> result in a compiler error.
> 
> I don't think that's something that could be realistically enforced 
> using static analysis.  How would you propose implementing that?

Umm... Now that I think of, the first comment I made is doable (Java 
does it), but the second... forget it.


More information about the Digitalmars-d-learn mailing list