:: Visual Foxpro, Foxpro for DOS
Re: нужно объяснение
Taran

Сообщений: 13626
Откуда: Красноярск
Дата регистрации: 16.01.2008
Развивая мысль можно сказать что никакая функция/процедура не вызывает ошибку. А ошибку вызывает её содержимое.
Ratings: 0 negative/0 positive
Re: нужно объяснение
akvvohinc

Сообщений: 4224
Откуда: Москва
Дата регистрации: 11.11.2008
Igor Korolyov
с выражением имени (то что в скобках) не возникает неоднозначностей

С выражением имени всё то же самое - если оно будет недопустимым в данном контексте, то получишь ошибку.

То же и с макро - нет никаких неоднозначностей - раскрой его и оцени правильность написания команды.
Просто большинство не пытается его раскрыть ни явно, ни в воображении до тех пор, пока не получит ту или иную ошибку. И хорошо ещё, если это будет ошибка синтаксиса.
Ratings: 0 negative/0 positive
Re: нужно объяснение
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
akvvohinc
Цитата:
В любом случае это особенность работы макро.
Это всё равно, что сказать -
"Ошибка в команде:
COPY FILE имя файла1 TO имя файла2
это особенность макро".
Нет, не так.
akvvohinc
С какой стати неверное значение переменной макроподстановки является особенностью самого макро?
С той что в данном конкретном случае автор пытается использовать макро для подстановки одного токена-параметра, не осознавая что по факту он подставил кучу совершенно отдельных токенов туда, где ожидается всего один.
И с того что замена макро на выражение имени решает проблему целиком и полностью - любое содержимое переменной (не важно правильное оно или нет, существует такой файл или нет) будет трактоваться строго как один токен-параметр "имя и путь исходного файла". Конечно же ошибки могут возникнуть и в этом случае - только это уже будут не синтаксические ошибки, а что-то типа "нет файла, занят файл, кривой путь..."

akvvohinc
Если нет, то очевидно, что макро здесь ни при чём.
Просто в макропеременной должно быть значение, которое после подстановки приводит к получению правильной команды.

И если именно это вы называете "особенностью макро", то могу лишь добавить, что любую команду - с макро или без макро - надо писать не менее "особенно".
Особенность макро в том что он тупо вписывает содержимое переменной в указанное место команды представленной в виде строки символов и потом заново её интерпретирует (ну или компилирует, если так будет проще). Он не угадывает желания разработчика, и не трактует переменную как нечто имеющее синтаксический смысл. Тогда как выражение имени - трактует, и не позволяет фоксу "понять" путь и имя файла как набор независимых токенов которые, кстати, вполне себе могут оказаться в итоге синтаксически корректной командой.
Близкой аналогией будет использование "динамического запроса" против "параметра запроса" в SQL (не только фоксовом) - наиболее частая "дыра" позволяющая использовать SQL-инъекцию и порадовать миллионы мамкиных кулхацкеров
И говорить о том что "всё дело" в правильном экранировании, санитизации, ограничении размера и использовании шаблонов ввода - это лечить симптомы вместо самой болезни.
В варианте
COPY FILE (m.lcOldFile) TO (m.lcNewFile)
попросту нет никакого пространства для "неправильного понимания" и соответственно ошибки. В варианте с макро - есть, и соответственно нужны все эти экранирования/проверки. Собственно говоря, это и есть "особенность макро" - а никак не команды COPY или любой другой.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: нужно объяснение
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
akvvohinc
С выражением имени всё то же самое - если оно будет недопустимым в данном контексте, то получишь ошибку.
Какую именно ошибку - вот в чём вопрос. НЕ ошибку синтаксиса. А так то да - конечно же нельзя сложить строку с числом, или скопировать несуществующий или недоступный файл.

P.S. ну и для хохмы пример инъекции для этой самой "банальной" COPY FILE.

lcFile = [C:\Windows\win.ini TO D:\some.txt &] + [&]
COPY FILE &lcFile TO "file2"
Если же ты считаешь что "поставил кавычки и в шоколаде", то у меня для тебя плохая новость...
lcFile = [C:\Windows\win.ini" TO D:\some.txt &] + [&]
COPY FILE "&lcFile" TO "file2"
ну или
lcFile = [C:\Windows\win.ini" TO D:\some.txt &] + [&]
lcEscapedFile = '"' + m.lcFile + '"'
COPY FILE &lcEscapedFile TO "file2"


------------------
WBR, Igor




Исправлено 1 раз(а). Последнее : Igor Korolyov, 05.10.21 00:16
Ratings: 0 negative/0 positive
Re: нужно объяснение
akvvohinc

Сообщений: 4224
Откуда: Москва
Дата регистрации: 11.11.2008
Igor Korolyov
С той что в данном конкретном случае автор пытается использовать макро для подстановки одного токена-параметра, не осознавая что по факту он подставил кучу совершенно отдельных токенов туда, где ожидается всего один.

Это "не осознавая" я бы не отнес к особенностям самого макро.

Более того, я бы поставил на то, что ТС не осознавал другое - он не видел ошибки в команде:
COPY FILE имя файла1 TO имя файла2
и именно поэтому и "не осознавал" то, что вы называете "особенностями макро".

Но если знать две вещи:
1) что происходит с командой в результате макроподстановки;
2) что команда COPY FILE в таком виде (без макро) недопустима.

то сразу становится понятно - дело не в макро.

Igor Korolyov
Особенность макро в том что он тупо вписывает содержимое переменной в указанное место команды представленной в виде строки символов и потом заново её интерпретирует
Это не особенность - это и есть сама суть макро.
И эта суть никак не привязана именно к этому примеру - так макро ведет себя всегда и везде, а не только при задании имени файла с пробелами.

А поэтому если бы ТС не понимал суть макро, то он бы вообще не мог ими пользоваться - ни в этом случае, ни в других.
Ratings: 0 negative/0 positive
Re: нужно объяснение
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Автор и не понимает сути макро - потому упорно пытается его впендюрить, несмотря на то что ему явно сказали что и как надо делать - БЕЗ макро.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: нужно объяснение
akvvohinc

Сообщений: 4224
Откуда: Москва
Дата регистрации: 11.11.2008
Цитата:
Если же ты считаешь что "поставил кавычки и в шоколаде", то у меня для тебя плохая новость...

Нет, я так не считаю, нигде и никогда не ратовал за использование макро без необходимости.

А то, что я не считаю, что данная ошибка была вызвана "особенностями макро", как отрицаю и само наличие у макро каких-либо особенностей - думаю, что имею право на такое мнение.
Ratings: 0 negative/0 positive
Re: нужно объяснение
axeum
Автор

Сообщений: 107
Дата регистрации: 07.07.2020
Igor Korolyov
Автор и не понимает сути макро - потому упорно пытается его впендюрить, несмотря на то что ему явно сказали что и как надо делать - БЕЗ макро.
так я же просто узнавал почему в 1 случае ошибка а во 2 случае нет ошибки, сделано же без макро , просто не до конца понимал какой вид получается у команды при подстановки макро в данном случае
Ratings: 0 negative/0 positive
Re: нужно объяснение
akvvohinc

Сообщений: 4224
Откуда: Москва
Дата регистрации: 11.11.2008
axeum
просто не до конца понимал какой вид получается у команды при подстановки макро в данном случае

Значит, ты можешь нас рассудить.

Тут выше говорили о том, что у макро есть какая-то "особенная особенность", из-за которой при использовании макро надо было добавить в команду COPY FILE кавычки.

Что это за особенность, я так и не понял - видимо, она в том, что при макрозамене к значению переменной эти кавычки Фоксом не были добавлены (а должны были).

Скажи, ты действительно не знал об этой "особенности" и ожидал, что кавычки появятся сами собой?
Или иначе - на какой вид команды после подстановки ты рассчитывал?
Ratings: 0 negative/0 positive
Re: нужно объяснение
axeum
Автор

Сообщений: 107
Дата регистрации: 07.07.2020
x='c:\мой файл.jpg'
messagebox(x) возвращал путь полностью, я и думал что при макро будет вид примерно такой
copy file c:\мой файл.jpg to file2
а что могут быть проблемы с пробелами я не знал

я не понимал что не так и почему команда copy file &x выдает мне ошибку, и пока пытался сделать так чтобы заработала как то чисто случайно дошел до того что закрыл ее в скобки и все сразу заработало

а кстати я в command прописывал именно в кавычках и искренне удивлялся и недоумевал да как то так, пишу в command все работает, а запускаю форму с кодом получаю ошибку
copy file 'c:\мой файл.jpg' to file2
но теперь я понял
получается опыта мало пока что
ну и не уверен что это какая то особенность, просто надо знать как это работает



Исправлено 1 раз(а). Последнее : axeum, 05.10.21 11:58
Ratings: 0 negative/0 positive
Re: нужно объяснение
akvvohinc

Сообщений: 4224
Откуда: Москва
Дата регистрации: 11.11.2008
Цитата:
я и думал что при макро будет вид примерно такой
copy file c:\мой файл.jpg to file2

а что могут быть проблемы с пробелами я не знал

Вот и я выше писал о том же - дело не в макро, а в неверном понимании того, как должна работать команда и без всякого макро:
akvvohinc
Более того, я бы поставил на то, что ТС не осознавал другое - он не видел ошибки в команде:
COPY FILE имя файла1 TO имя файла2
Ratings: 0 negative/0 positive
Re: нужно объяснение
akvvohinc

Сообщений: 4224
Откуда: Москва
Дата регистрации: 11.11.2008
axeum
x='c:\мой файл.jpg'
messagebox(x) возвращал путь полностью
Если бы ты в messagebox() тоже использовал макро, то получил и аналогичную ошибку:
messagebox(&x)

А дело-то всё в том, что в строке:
'c:\мой файл.jpg'
как это не покажется удивительным, нет кавычек - ни одинарных, ни двойных!

Здесь кавычки - символы-ограничители (delimiters) строкового значения, в самой строке их нет.
Соответственно, и при макроподстановке они не могут возникнуть "из ниоткуда".

И в этой теме мне объяснили, что отсутствие интеллекта у Фокса при выполнении макро и есть особенность макро.
Igor Korolyov
Он не угадывает желания разработчика, и не трактует переменную как нечто имеющее синтаксический смысл.

Мой ответ - не стоит ждать от макро того, что не описано в Help - тогда и отсутствие таких возможностей как угадывание желаний разработчика не придётся относить к его особенностям.

Я, например, не жду, написав &lcpath, что всю остальную часть приложения Фокс напишет за меня сам, а ведь это также можно считать особенностью макро.



Исправлено 3 раз(а). Последнее : akvvohinc, 05.10.21 13:14
Ratings: 0 negative/0 positive
Re: нужно объяснение
Ydin

Сообщений: 7648
Откуда: Киев
Дата регистрации: 16.12.2005
Макроподстановка:
lcFrom = [c:\мой файл.jpg]
Copy file &lcfrom ...
Проверяю
Copy file c:\мой файл.jpg ...

Этому же далеко до таких споров.
Раньше рекомендовали вместо макро писать в скобках.
Но это для избранных команд. Это не везде!
Ratings: 0 negative/0 positive
Re: нужно объяснение
akvvohinc

Сообщений: 4224
Откуда: Москва
Дата регистрации: 11.11.2008
Ydin
Раньше рекомендовали вместо макро писать в скобках.

Александр, дело не в скобках - рекомендовали писать выражение.
А в данном случае это должно быть выражение, которое не может быть "узнано" компилятором как имя файла.

Именно он научен различать эти команды "по сути":
COPY FILE lcFrom
COPY FILE m.lcFrom
COPY FILE (lcFrom)
COPY FILE m.lcFrom+''
Первые две строки будут восприняты им как возможное имя файла, а не как выражение.
А две последние - как выражение.
Причем, третий и четвертый варианты могут быть и именем файла, но компилятор "специально научили" (я так думаю) считать эти варианты выражением.

В зависимости от этого и результаты компиляции этих двух вариантов будут принципиально разными.
Соответственно, всё это надо бы учитывать и при написании макро, если уж им пользоваться.



Исправлено 1 раз(а). Последнее : akvvohinc, 05.10.21 16:39
Ratings: 0 negative/0 positive
Re: нужно объяснение
Ydin

Сообщений: 7648
Откуда: Киев
Дата регистрации: 16.12.2005
akvvohinc
Ydin
Раньше рекомендовали вместо макро писать в скобках.

Александр, дело не в скобках - рекомендовали писать выражение.
А в данном случае это должно быть выражение, которое не может быть "узнано" компилятором как имя файла.

Именно он научен различать эти команды "по сути":
COPY FILE lcFrom
COPY FILE m.lcFrom
COPY FILE (lcFrom)
COPY FILE m.lcFrom+''
Первые две строки будут восприняты им как возможное имя файла, а не как выражение.
А две последние - как выражение.
Причем, третий и четвертый варианты могут быть и именем файла, но компилятор "специально научили" (я так думаю) считать эти варианты выражением.

В зависимости от этого и результаты компиляции этих двух вариантов будут принципиально разными.
Соответственно, всё это надо бы учитывать и при написании макро, если уж им пользоваться.

Тут в Ваших примерах нет macro.

В Фоксе есть параметры команд, где надо писать переменную, а где-то значение.
Для таких команд хотели написать удобное.
Удобно писать COPY FILE c:\мой файл.jpg

еще удобно писать
lcFrom = [c:\мой файл.jpg]
COPY FILE &lcFrom
или
COPY FILE (lcFrom)

И все!
Там, где надо значение COPY FILE c:\мой файл.jpg, если у нас переменная, пишем COPY FILE (lcFrom)
Или макро
COPY FILE &lcFrom
а это будет - COPY FILE c:\мой файл.jpg

Я сам писал framework. В нем тоже, есть какие-то команды.
И где-то проверял, что есть файл c:\мой файл.jpg -
?File([c:\мой файл.jpg])
Если его нет, то проверял lcFrom по значению переменной
?File(lcFrom)
"Дружественный интерфейс"

Фокс более строг.
В Фоксе не так, а может где-то и так, но я не помню.

Macro - раньше считалось, что плохо, но можно.
На IBM PC XT 286 в циклах по времени было плохо
Сейчас не те компьютеры, чтобы об это тужить.

Но если я тут сам написал что-то не так, то не удивлюсь.
Можете не обращать на это внимание



Исправлено 4 раз(а). Последнее : Ydin, 05.10.21 19:00
Ratings: 0 negative/0 positive
Re: нужно объяснение
Taran

Сообщений: 13626
Откуда: Красноярск
Дата регистрации: 16.01.2008
Ух ты, начали с начала.
Просто восторг.
Ratings: 0 negative/0 positive
Re: нужно объяснение
Ydin

Сообщений: 7648
Откуда: Киев
Дата регистрации: 16.12.2005
Taran
Ух ты, начали с начала.
Просто восторг.

С конца тоже начинается начало. Это все от того, кто и когда кончит
Ratings: 0 negative/0 positive
Re: нужно объяснение
Taran

Сообщений: 13626
Откуда: Красноярск
Дата регистрации: 16.01.2008
Ydin
Taran
Ух ты, начали с начала.
Просто восторг.

С конца тоже начинается начало. Это все от того, кто и когда кончит

О волнующих проблемах можно потрепаться в курилке.
Человек (новичок в фоксе) конкретно спросил о разнице двух методов и мусора навалили две страницы. Сложно зерна отделить...
Ratings: 0 negative/0 positive
Re: нужно объяснение
Ydin

Сообщений: 7648
Откуда: Киев
Дата регистрации: 16.12.2005
Сложно зерна отделить...
Да, что-то тут из того, что не зерна!
Ratings: 0 negative/0 positive
Re: нужно объяснение
akvvohinc

Сообщений: 4224
Откуда: Москва
Дата регистрации: 11.11.2008
Цитата:
Там, где надо значение COPY FILE c:\мой файл.jpg, если у нас переменная, пишем COPY FILE (lcFrom)
Или макро
COPY FILE &lcFrom
а это будет - COPY FILE c:\мой файл.jpg

Вот ТС именно так и написал макро.
Но оказалось, что так, да не так.
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 43 Каратаев Guest (Гостей: 41)

© 2000-2024 Fox Club 
Яндекс.Метрика