Глюк с PChar

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Глюк с PChar

Сообщение STAKANOV » 10.04.2013 14:21:09

tablo@web:~/dev-test$ fpc
Free Pascal Compiler version 2.6.2 [2013/02/16] for x86_64
Copyright (c) 1993-2012 by Florian Klaempfl and others
...
tablo@web:~/dev-test$ uname -a
Linux web.[засекречено] 3.5.0-24-generic #37-Ubuntu SMP Thu Feb 7 01:50:30 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

Случайно столкнулся:

Код: Выделить всё
program gluk;
uses strings;
var
   p1:pchar;
   p2:pchar;
begin
   p1:='xx';
   p2:='xx';
   StrPCopy(p1,'yy');
   StrPcopy(p2,'zz');
   writeln(p1);
   writeln(p2);
end.


угадайте результат?
у меня:
tablo@web:~/dev-test$ ./gluk
zz
zz


у всех так? я понимаю, что это результат оптимизации... пора в баг репорт писать?
Аватара пользователя
STAKANOV
энтузиаст
 
Сообщения: 1069
Зарегистрирован: 14.05.2006 21:26:24
Откуда: Зеленоград

Re: Глюк с PChar

Сообщение SeZuka » 10.04.2013 14:30:08

У меня так. Пишите.

Добавлено спустя 6 минут 28 секунд:
Хотя это документированное поведение:
11.1.2. Слияние констант
При использовании одной и той же строковой константы, значения с плавающей точкой или константы-множества два и более раз генерируется только одна копия этой константы.
SeZuka
постоялец
 
Сообщения: 209
Зарегистрирован: 05.09.2012 14:58:05

Re: Глюк с PChar

Сообщение Sergei I. Gorelkin » 10.04.2013 15:04:00

Кроме того, в 2.7.1 литералы помещаются в read-only память, поэтому данная программа будет падать.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1407
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Глюк с PChar

Сообщение STAKANOV » 10.04.2013 15:05:29

но вот только это не константы, а переменные ;-) и программа работает, я ж результат показал

Добавлено спустя 14 минут 14 секунд:
нда, а ведь и правда документированное поведение http://www.freepascal.org/docs-html/ref/refsu16.html#x39-420003.2.10:

program one;
var P : PChar;
begin
P := ’This is a null-terminated string.’;
WriteLn (P);
end.
Results in the same as

program two;
const P : PChar = ’This is a null-terminated string.’;
begin
WriteLn (P);
end.
Аватара пользователя
STAKANOV
энтузиаст
 
Сообщения: 1069
Зарегистрирован: 14.05.2006 21:26:24
Откуда: Зеленоград

Re: Глюк с PChar

Сообщение SeZuka » 10.04.2013 17:17:39

STAKANOV писал(а):но вот только это не константы

'xx', 'yy' и 'zz' это строковые константы
Более того, следующий код:
Код: Выделить всё
program gluk;
uses strings;
var
   p1:pchar;
   p2:pchar;
begin
   p1:='xx';
   StrPCopy(p1,'yy');
   p2:='xx';
   writeln(p2);
end.

Вернет 'yy', как вам такое? :D
SeZuka
постоялец
 
Сообщения: 209
Зарегистрирован: 05.09.2012 14:58:05

Re: Глюк с PChar

Сообщение Sergei I. Gorelkin » 10.04.2013 17:46:14

А если 'yy' заменить на что-то подлиннее, можно получить (в 2.6.x) гораздо более интересные результаты, т.к. окажется затертым кусок сегмента данных.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1407
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Глюк с PChar

Сообщение alexs » 10.04.2013 19:45:03

Интересно, почему работа с указателями идёт так, как будто им не надо память выделять?
PChar вообщето указатель...
И потом удивляемся странному поведению...
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4064
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Глюк с PChar

Сообщение SeZuka » 11.04.2013 05:24:59

alexs писал(а):Интересно, почему работа с указателями идёт так, как будто им не надо память выделять?
PChar вообщето указатель...
И потом удивляемся странному поведению...

Это вопрос разработчикам FPC?
Странно что операция p1:='xx'; не выделяет память сама. По моему надо либо вообще запретить присвоение указателю константы, либо чтобы константа копировалась с выделением памяти при присвоении указателю.

Sergei I. Gorelkin писал(а):Кроме того, в 2.7.1 литералы помещаются в read-only память, поэтому данная программа будет падать.

А вот с этим костылем будем получать ошибки совсем в другом месте, а не там где их совершили.
SeZuka
постоялец
 
Сообщения: 209
Зарегистрирован: 05.09.2012 14:58:05

Re: Глюк с PChar

Сообщение alexey38 » 11.04.2013 07:32:30

SeZuka писал(а):Странно что операция p1:='xx'; не выделяет память сама. По моему надо либо вообще запретить присвоение указателю константы, либо чтобы константа копировалась с выделением памяти при присвоении указателю.

Для работы с PChar (и их вариациями) вообще нельзя использовать операции присваивания. Компилятор не ругается, но не нужно путать типы String и PChar. Паскалисты с древних времен привыкли к удобным строковым операциям, а сишники очень долго мудохались со строками, пока у них не появились аналоги типа std::String.

Так вот для работы с PChar нужно использовать StrCopy, StrNew и т.п. И вообще нужно использовать PChar как можно реже. Очень опасный тип, большинство косяков ОС и браузеров - это все от этого типа данных. Работая с этим типом данных в паскале мы получаем все косяки, на которые уже весь мир много лет наступает.

Добавлено спустя 3 минуты 23 секунды:
SeZuka писал(а):А вот с этим костылем будем получать ошибки совсем в другом месте, а не там где их совершили.

Наоборот, мы получим исключение именно там, где находится логическая ошибка, а именно копирование без выделения памяти.
Делая StrCopy (StrPCopy) нужно десять раз подумать, что за память, которую мы пытаемся перетереть. Мы должны проверить сколько там выделено памяти и т.п. Вокруг этой операции нужно обвешать всякими там условиями и т.п.
alexey38
долгожитель
 
Сообщения: 1627
Зарегистрирован: 27.04.2011 19:42:31

Re: Глюк с PChar

Сообщение SSerge » 11.04.2013 07:58:33

SeZuka писал(а):Странно что операция p1:='xx'; не выделяет память сама.


Гм. Нынешние компиляторы C/C++ и то верещат по поводу таких конструкций:

char *s="allocated string";

Сообщениями типа "Несовместимый тип присваивания" или что нибудь типа "присвоение переменной статического указателя", причем на уровне *ошибок* синтаксиса, а даже не примечаний. Компилятор паскаля по сути ЗРЯ такие конструкции пропускает, для него это вообще некорректная операция.
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

Рейтинг@Mail.ru