<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	>
<channel>
	<title>Comments on: Undefined behavior &#8211; это все, что явно не указано в документации.</title>
	<atom:link href="http://blog.not-a-kernel-guy.com/2008/06/30/316/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.not-a-kernel-guy.com/2008/06/30/316</link>
	<description>... in the Windows kernel team</description>
	<pubDate>Thu, 04 Dec 2008 06:23:40 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6</generator>
		<item>
		<title>By: amirul</title>
		<link>http://blog.not-a-kernel-guy.com/2008/06/30/316#comment-11777</link>
		<dc:creator>amirul</dc:creator>
		<pubDate>Fri, 29 Aug 2008 23:48:01 +0000</pubDate>
		<guid isPermaLink="false">http://blog.not-a-kernel-guy.com/2008/06/30/316#comment-11777</guid>
		<description>OUT появился в C (MS edition) задолго до того, как появился сам C#, в котором "есть и OUT и REF". Если Вам не нравится различия в поведении OUT в C и C#, то пенять надо прежде всего разработчикам C#, а не C.</description>
		<content:encoded><![CDATA[<p>OUT появился в C (MS edition) задолго до того, как появился сам C#, в котором &#8220;есть и OUT и REF&#8221;. Если Вам не нравится различия в поведении OUT в C и C#, то пенять надо прежде всего разработчикам C#, а не C.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Stoune</title>
		<link>http://blog.not-a-kernel-guy.com/2008/06/30/316#comment-11626</link>
		<dc:creator>Stoune</dc:creator>
		<pubDate>Tue, 22 Jul 2008 14:14:56 +0000</pubDate>
		<guid isPermaLink="false">http://blog.not-a-kernel-guy.com/2008/06/30/316#comment-11626</guid>
		<description>Ау, народ очнитесь, документации по WinAPI и ядру сколько лет не напомните, какие управляемые языки, ява в зачаточном состоянии только в 1996-ом появилась? 
Определениям OUT, REF в понимании Microsoft всё таки больше. Я не понимаю подхода "солнце жёлтое, а я хочу чтобы было зелёное" и появление в современных! языках отличной от WinAPI терминологии ничего не изменяет. Если я читаю MSDN пояснение как интерпретировать данные термины, я буду пытаться именно так их интерпретировать и если будет что-то не так, я трижды проверю не ошибся ли я в понимании, а после отправлю отчёт об ошибке в Майкрософт, а не буду притягивать за уши что мне хочется чтобы так было.</description>
		<content:encoded><![CDATA[<p>Ау, народ очнитесь, документации по WinAPI и ядру сколько лет не напомните, какие управляемые языки, ява в зачаточном состоянии только в 1996-ом появилась?<br />
Определениям OUT, REF в понимании Microsoft всё таки больше. Я не понимаю подхода &#8220;солнце жёлтое, а я хочу чтобы было зелёное&#8221; и появление в современных! языках отличной от WinAPI терминологии ничего не изменяет. Если я читаю MSDN пояснение как интерпретировать данные термины, я буду пытаться именно так их интерпретировать и если будет что-то не так, я трижды проверю не ошибся ли я в понимании, а после отправлю отчёт об ошибке в Майкрософт, а не буду притягивать за уши что мне хочется чтобы так было.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Not a kernel guy : Проверка параметров функции.</title>
		<link>http://blog.not-a-kernel-guy.com/2008/06/30/316#comment-11622</link>
		<dc:creator>Not a kernel guy : Проверка параметров функции.</dc:creator>
		<pubDate>Tue, 22 Jul 2008 06:19:49 +0000</pubDate>
		<guid isPermaLink="false">http://blog.not-a-kernel-guy.com/2008/06/30/316#comment-11622</guid>
		<description>[...] пост про параметры функций вызвал на удивление много споров, так что я еще [...]</description>
		<content:encoded><![CDATA[<p>[...] пост про параметры функций вызвал на удивление много споров, так что я еще [...]</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Not a kernel guy &#187; Blog Archive &#187; Проверка параметров функции.</title>
		<link>http://blog.not-a-kernel-guy.com/2008/06/30/316#comment-11621</link>
		<dc:creator>Not a kernel guy &#187; Blog Archive &#187; Проверка параметров функции.</dc:creator>
		<pubDate>Tue, 22 Jul 2008 06:18:01 +0000</pubDate>
		<guid isPermaLink="false">http://blog.not-a-kernel-guy.com/2008/06/30/316#comment-11621</guid>
		<description>[...] пост про параметры функций вызвал на удивление много споров, так что я еще [...]</description>
		<content:encoded><![CDATA[<p>[...] пост про параметры функций вызвал на удивление много споров, так что я еще [...]</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: code writer</title>
		<link>http://blog.not-a-kernel-guy.com/2008/06/30/316#comment-11590</link>
		<dc:creator>code writer</dc:creator>
		<pubDate>Wed, 09 Jul 2008 09:10:02 +0000</pubDate>
		<guid isPermaLink="false">http://blog.not-a-kernel-guy.com/2008/06/30/316#comment-11590</guid>
		<description>Я говорил, что я не против, чтобы осталось и так. Если стоит выбор - скорость или красота, конечно первое должно побеждать.</description>
		<content:encoded><![CDATA[<p>Я говорил, что я не против, чтобы осталось и так. Если стоит выбор - скорость или красота, конечно первое должно побеждать.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Not a kernel guy</title>
		<link>http://blog.not-a-kernel-guy.com/2008/06/30/316#comment-11589</link>
		<dc:creator>Not a kernel guy</dc:creator>
		<pubDate>Wed, 09 Jul 2008 06:52:30 +0000</pubDate>
		<guid isPermaLink="false">http://blog.not-a-kernel-guy.com/2008/06/30/316#comment-11589</guid>
		<description>2-4 команды, не вызова. Например, чтобы проинициализировать вот такой параметр:

&lt;blockquote&gt;__deref_out PVOID* Param&lt;/blockquote&gt;

нужно две команды:

&lt;blockquote&gt;mov eax, [esp+Param]
mov [eax], 0&lt;/blockquote&gt;

А вот чтобы проинициализировать вот такой:

&lt;blockquote&gt;__deref_opt_out PVOID* Param&lt;/blockquote&gt;

Уже нужен условный переход или conditional mov:

&lt;blockquote&gt;mov eax, [esp+Param]
test eax, eax
jz @f
mov [eax], 0
@@:&lt;/blockquote&gt;

Не говоря уже о том, что обычно нужно записать больше 4-х байт.</description>
		<content:encoded><![CDATA[<p>2-4 команды, не вызова. Например, чтобы проинициализировать вот такой параметр:</p>
<blockquote><p>__deref_out PVOID* Param</p></blockquote>
<p>нужно две команды:</p>
<blockquote><p>mov eax, [esp+Param]<br />
mov [eax], 0</p></blockquote>
<p>А вот чтобы проинициализировать вот такой:</p>
<blockquote><p>__deref_opt_out PVOID* Param</p></blockquote>
<p>Уже нужен условный переход или conditional mov:</p>
<blockquote><p>mov eax, [esp+Param]<br />
test eax, eax<br />
jz @f<br />
mov [eax], 0<br />
@@:</p></blockquote>
<p>Не говоря уже о том, что обычно нужно записать больше 4-х байт.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: code writer</title>
		<link>http://blog.not-a-kernel-guy.com/2008/06/30/316#comment-11588</link>
		<dc:creator>code writer</dc:creator>
		<pubDate>Wed, 09 Jul 2008 05:34:00 +0000</pubDate>
		<guid isPermaLink="false">http://blog.not-a-kernel-guy.com/2008/06/30/316#comment-11588</guid>
		<description>&lt;acronym title=""&gt;Вы предлагаете добавить несколько команд (2-4) в каждую функцию API, что эквивалентно по частоте вызовов.&lt;/acronym&gt;

Откуда там 2-4 вызова?</description>
		<content:encoded><![CDATA[<p><acronym title="">Вы предлагаете добавить несколько команд (2-4) в каждую функцию API, что эквивалентно по частоте вызовов.</acronym></p>
<p>Откуда там 2-4 вызова?</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Not a kernel guy</title>
		<link>http://blog.not-a-kernel-guy.com/2008/06/30/316#comment-11585</link>
		<dc:creator>Not a kernel guy</dc:creator>
		<pubDate>Tue, 08 Jul 2008 16:00:56 +0000</pubDate>
		<guid isPermaLink="false">http://blog.not-a-kernel-guy.com/2008/06/30/316#comment-11585</guid>
		<description>&lt;blockquote&gt;Они не проверяли и не будут проверять результат, поэтому любители не скроются.&lt;/blockquote&gt;

Это не так, к сожалению. Как показывает практика, если какая-то функция, которая всегда инициализировала буфер (даже если в этом не было необходимости, как в примере выше), вдруг перестает это делать - обязятельно кто-то с грохотом упадёт по Access Violation. И это в production коде.

Так что безусловная инициализация буфера (нулями) - это хороший способ протащить несколько багов в production. Другое дело, если инициализировать буфер случайным мусором. Но это можно делать только в отладочном коде.

&lt;blockquote&gt;Третье - неужели написать одно присваивание так сложно? &lt;/blockquote&gt;

Одно присваивание - не сложно, но даже оно увеличивает объем кода, т.к. каждая функция должна это делать. Только кто вам сказал, что там будет только одно присваивание? Помимо строк функции могут возвращать и другие типы, включая вложенные буферы или полиморфные структуры. Их тоже, скажете, нужно инициализировать всегда и везде?

&lt;blockquote&gt;Одно присваивание конечно очень сильно скажется на производительности и процессорном цеше&lt;/blockquote&gt;

Вы не поверите, но удлиннение кода перехода из user mode в kernel mode на несколько (2-4) команд уже заметно на тестах "общего назначения". Вы предлагаете добавить несколько команд (2-4) в каждую функцию API, что эквивалентно по частоте вызовов.</description>
		<content:encoded><![CDATA[<blockquote><p>Они не проверяли и не будут проверять результат, поэтому любители не скроются.</p></blockquote>
<p>Это не так, к сожалению. Как показывает практика, если какая-то функция, которая всегда инициализировала буфер (даже если в этом не было необходимости, как в примере выше), вдруг перестает это делать - обязятельно кто-то с грохотом упадёт по Access Violation. И это в production коде.</p>
<p>Так что безусловная инициализация буфера (нулями) - это хороший способ протащить несколько багов в production. Другое дело, если инициализировать буфер случайным мусором. Но это можно делать только в отладочном коде.</p>
<blockquote><p>Третье - неужели написать одно присваивание так сложно? </p></blockquote>
<p>Одно присваивание - не сложно, но даже оно увеличивает объем кода, т.к. каждая функция должна это делать. Только кто вам сказал, что там будет только одно присваивание? Помимо строк функции могут возвращать и другие типы, включая вложенные буферы или полиморфные структуры. Их тоже, скажете, нужно инициализировать всегда и везде?</p>
<blockquote><p>Одно присваивание конечно очень сильно скажется на производительности и процессорном цеше</p></blockquote>
<p>Вы не поверите, но удлиннение кода перехода из user mode в kernel mode на несколько (2-4) команд уже заметно на тестах &#8220;общего назначения&#8221;. Вы предлагаете добавить несколько команд (2-4) в каждую функцию API, что эквивалентно по частоте вызовов.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: code writer</title>
		<link>http://blog.not-a-kernel-guy.com/2008/06/30/316#comment-11584</link>
		<dc:creator>code writer</dc:creator>
		<pubDate>Tue, 08 Jul 2008 05:45:25 +0000</pubDate>
		<guid isPermaLink="false">http://blog.not-a-kernel-guy.com/2008/06/30/316#comment-11584</guid>
		<description>Подведу такой итог, ибо спор здесь бессмысленен:

Наезды на MS необоснованы, потому что нарушения нет и функция ведет себя корректно. Но хотелось бы красоты.</description>
		<content:encoded><![CDATA[<p>Подведу такой итог, ибо спор здесь бессмысленен:</p>
<p>Наезды на MS необоснованы, потому что нарушения нет и функция ведет себя корректно. Но хотелось бы красоты.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: code writer</title>
		<link>http://blog.not-a-kernel-guy.com/2008/06/30/316#comment-11583</link>
		<dc:creator>code writer</dc:creator>
		<pubDate>Tue, 08 Jul 2008 05:34:21 +0000</pubDate>
		<guid isPermaLink="false">http://blog.not-a-kernel-guy.com/2008/06/30/316#comment-11583</guid>
		<description>1. Ухудшить производительность и загадить процессорный кеш;
2. Уменьшить вероятность обраружения любителей не проверять результат функции во время тестирования;
3. Усложнить написание и сопровождение кода API.

Начнем со второго. Они не проверяли и не будут проверять результат, поэтому любители не скроются. 

Третье - неужели написать одно присваивание так сложно? 

Ради чего? Ради красоты и простоты сопровождения. Мне кажеться, как раз сопровождение упростится.

А теперь первое. Одно присваивание конечно очень сильно скажется на производительности и процессорном цеше. Если Microsoft так сильно боится потерять пару процессорных тактов ради красоты и удобства, то может оставить и так. На мой взгляд, данное улучшение стоит потери пары тактов. Да, оно практически бессмысленно, и кроме эстетических улучшений не несет в себе ничего особого. Но я же не зря привел пример с чистотой. Для меня в чистоте приятнее работать.</description>
		<content:encoded><![CDATA[<p>1. Ухудшить производительность и загадить процессорный кеш;<br />
2. Уменьшить вероятность обраружения любителей не проверять результат функции во время тестирования;<br />
3. Усложнить написание и сопровождение кода API.</p>
<p>Начнем со второго. Они не проверяли и не будут проверять результат, поэтому любители не скроются. </p>
<p>Третье - неужели написать одно присваивание так сложно? </p>
<p>Ради чего? Ради красоты и простоты сопровождения. Мне кажеться, как раз сопровождение упростится.</p>
<p>А теперь первое. Одно присваивание конечно очень сильно скажется на производительности и процессорном цеше. Если Microsoft так сильно боится потерять пару процессорных тактов ради красоты и удобства, то может оставить и так. На мой взгляд, данное улучшение стоит потери пары тактов. Да, оно практически бессмысленно, и кроме эстетических улучшений не несет в себе ничего особого. Но я же не зря привел пример с чистотой. Для меня в чистоте приятнее работать.</p>
]]></content:encoded>
	</item>
</channel>
</rss>
