<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE bugzilla SYSTEM "https://bugs.webkit.org/page.cgi?id=bugzilla.dtd">

<bugzilla version="5.0.4.1"
          urlbase="https://bugs.webkit.org/"
          
          maintainer="admin@webkit.org"
>

    <bug>
          <bug_id>36527</bug_id>
          
          <creation_ts>2010-03-24 05:55:23 -0700</creation_ts>
          <short_desc>Need an ASSERT that&apos;s enabled in release builds</short_desc>
          <delta_ts>2010-04-06 06:46:05 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>WebCore Misc.</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>PC</rep_platform>
          <op_sys>OS X 10.5</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Jeremy Moskovich">playmobil</reporter>
          <assigned_to name="Jeremy Moskovich">playmobil</assigned_to>
          <cc>ap</cc>
    
    <cc>commit-queue</cc>
    
    <cc>crogers</cc>
    
    <cc>darin</cc>
    
    <cc>fishd</cc>
    
    <cc>ggaren</cc>
    
    <cc>jorlow</cc>
    
    <cc>mark</cc>
    
    <cc>mjs</cc>
    
    <cc>sam</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>203392</commentid>
    <comment_count>0</comment_count>
    <who name="Jeremy Moskovich">playmobil</who>
    <bug_when>2010-03-24 05:55:23 -0700</bug_when>
    <thetext>The current ASSERT() macro is disabled in release builds, call sites that would otherwise call it make direct use of the CRASH() macro.

It would be nice to have a version of ASSERT() that does work in release builds to use instead of making calls to CRASH() - FATAL_ASSERT() ?

In Chromium we have CHECK &amp; DCHECK macros for this purpose.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>203395</commentid>
    <comment_count>1</comment_count>
    <who name="Jeremy Orlow">jorlow</who>
    <bug_when>2010-03-24 06:14:12 -0700</bug_when>
    <thetext>I definitely agree.  For example, I&apos;m reviewing audio code that has ASSERTs for sanity checks on buffer lengths.  If there is some bad assumption that would cause us to exceed our buffer, we&apos;d much rather crash rather than allow a possible exploit.  But it doesn&apos;t make sense to add complex error code paths for stuff that should never happen.  So instead I&apos;ve been suggesting adding |if (...) CRASH();|s.  I think having a proper macro would be beneficial though.

Another example of where this is useful is https://bugs.webkit.org/show_bug.cgi?id=36426 where Jeremy (the other one) added some debug code to the Chromium WebKit API to try and expose a bug.

Any thoughts on the best name for this?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>203412</commentid>
    <comment_count>2</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2010-03-24 08:23:20 -0700</bug_when>
    <thetext>The major reason the expression goes inside the assert invocation is so that the entire expression can be compiled out.

For the rare cases where we want assertions even in production code, I think it&apos;s good to have all the code outside any macro.

We can give CRASH a better name to make it clearer how it should be used and maybe even add a message, but I&apos;d prefer not to also have an ASSERT-style macro where the contents are always evaluated. Such things can be written as if statements. But since the Chrome project already has this, maybe you guys don&apos;t agree.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>203416</commentid>
    <comment_count>3</comment_count>
    <who name="Jeremy Orlow">jorlow</who>
    <bug_when>2010-03-24 08:31:13 -0700</bug_when>
    <thetext>(In reply to comment #2)
&gt; The major reason the expression goes inside the assert invocation is so that
&gt; the entire expression can be compiled out.
&gt; 
&gt; For the rare cases where we want assertions even in production code, I think
&gt; it&apos;s good to have all the code outside any macro.
&gt; 
&gt; We can give CRASH a better name to make it clearer how it should be used and
&gt; maybe even add a message, but I&apos;d prefer not to also have an ASSERT-style macro
&gt; where the contents are always evaluated. Such things can be written as if
&gt; statements. But since the Chrome project already has this, maybe you guys don&apos;t
&gt; agree.

Normally I&apos;d agree with you.  I guess the main reason why having a macro seems natural here is that I see it as a variant of ASSERT and ASSERT is a macro.  I suppose that&apos;s the only reason though.  I don&apos;t feel super strongly, so if others feel the same way, we can close this as WONTFIX.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>203427</commentid>
    <comment_count>4</comment_count>
    <who name="Darin Fisher (:fishd, Google)">fishd</who>
    <bug_when>2010-03-24 08:50:59 -0700</bug_when>
    <thetext>Can we see some examples of code that would be cleaner with FATAL_ASSERT?  Maybe that would be helpful in evaluating the need.  I tend to agree that explicitly calling CRASH is fine, and I don&apos;t see the need for a CHECK equivalent in WebKit.

For reference, the Chromium codebase inherits DCHECK and CHECK from internal Google code.  Those are part of a standard logging package that everyone at Gogole uses, and we wanted to make it easy for anyone at Google to hack Chromium.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>203430</commentid>
    <comment_count>5</comment_count>
    <who name="Jeremy Orlow">jorlow</who>
    <bug_when>2010-03-24 08:54:03 -0700</bug_when>
    <thetext>https://bugs.webkit.org/show_bug.cgi?id=36426 (that I posted earlier) is a good example.

Also https://bugs.webkit.org/attachment.cgi?id=51461&amp;action=review (search for &quot;CRASH&quot;).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>203501</commentid>
    <comment_count>6</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2010-03-24 11:06:42 -0700</bug_when>
    <thetext>If we think the word FATAL expresses this well, then I think we probably a name like FATAL_ERROR for something that invokes CRASH. I personally think we can live with only FATAL_ERROR, but I would not be strongly opposed to FATAL_ASSERT.

I think we need a brief note on the website explaining the proper use of these. I worry that they will be used too often.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>203504</commentid>
    <comment_count>7</comment_count>
    <who name="Jeremy Orlow">jorlow</who>
    <bug_when>2010-03-24 11:15:30 -0700</bug_when>
    <thetext>(In reply to comment #6)
&gt; If we think the word FATAL expresses this well, then I think we probably a name
&gt; like FATAL_ERROR for something that invokes CRASH. I personally think we can
&gt; live with only FATAL_ERROR, but I would not be strongly opposed to
&gt; FATAL_ASSERT.
&gt; 
&gt; I think we need a brief note on the website explaining the proper use of these.
&gt; I worry that they will be used too often.

Since both of you (Darins) are against this, I&apos;m perfectly fine with us dropping this.

But, if we do go ahead with this, I&apos;d say that |FATAL_ERROR(some_expression);| is less clearly an assertion than |FATAL_ASSERT(some_expression);|.

And where on the web page would be good for a note?

Anyone else have thoughts?  If no one else is in favor, maybe we should just forget about this and continue with |if () CRASH;|</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>203507</commentid>
    <comment_count>8</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2010-03-24 11:23:31 -0700</bug_when>
    <thetext>FATAL_ERROR is a new name for CRASH, not a name for an assertion. The macro would not take an argument.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>203508</commentid>
    <comment_count>9</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2010-03-24 11:24:06 -0700</bug_when>
    <thetext>I think the note could be like the RefPtr one I wrote a while back. I&apos;m not sure where the link to that is, but the key is the content; linking to it is easy.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>203512</commentid>
    <comment_count>10</comment_count>
    <who name="Jeremy Orlow">jorlow</who>
    <bug_when>2010-03-24 11:32:10 -0700</bug_when>
    <thetext>(In reply to comment #8)
&gt; FATAL_ERROR is a new name for CRASH, not a name for an assertion. The macro
&gt; would not take an argument.

Ohhh.  I see.  Yeah, I guess FATAL_ERROR is a bit more clear than CRASH, but honestly I&apos;m not sure it&apos;s enough of an improvement to warrant a change.  But I assume you do?


(In reply to comment #9)
&gt; I think the note could be like the RefPtr one I wrote a while back. I&apos;m not
&gt; sure where the link to that is, but the key is the content; linking to it is
&gt; easy.

I agree linking is easy, but if no one can find the link, what&apos;s the use?  :-)

To be honest, I wonder if a code comment above CRASH is the right thing to do here.  I think a separate web page for PassRefPtr/RefPtr makes sense since it&apos;s indexed by search engines and because it&apos;s pretty big for putting inside the code (plus it&apos;s not clear whether it&apos;d go in PassRefPtr or RefPtr.h) but I don&apos;t think CRASH/FATAL_ERROR suffer from this problem.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>203516</commentid>
    <comment_count>11</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2010-03-24 11:38:35 -0700</bug_when>
    <thetext>(In reply to comment #10)
&gt; To be honest, I wonder if a code comment above CRASH is the right thing to do
&gt; here.

We can start with that.

&gt; I don&apos;t think CRASH/FATAL_ERROR suffer from this problem.

I think we need a guide for when to use assertions and when to use CRASH. Not just a comment in the code, but a background about rationale for the project.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>203519</commentid>
    <comment_count>12</comment_count>
    <who name="Jeremy Orlow">jorlow</who>
    <bug_when>2010-03-24 11:43:46 -0700</bug_when>
    <thetext>(In reply to comment #11)
&gt; (In reply to comment #10)
&gt; &gt; To be honest, I wonder if a code comment above CRASH is the right thing to do
&gt; &gt; here.
&gt; 
&gt; We can start with that.

Sounds good.  Jeremy are you willing to do this?

&gt; &gt; I don&apos;t think CRASH/FATAL_ERROR suffer from this problem.
&gt; 
&gt; I think we need a guide for when to use assertions and when to use CRASH. Not
&gt; just a comment in the code, but a background about rationale for the project.

I can try taking a stab at this if you&apos;d like, but I can&apos;t think of much more than a paragraph or so to say on the subject.

I guess the gist is that you should ASSERT on stuff that should never happen that will cause incorrect results but shouldn&apos;t result in a crash or memory corruption.  CRASH should be used when we&apos;re reasonably sure something should never happen but it happening would be _really_ bad.  It can also be used when there&apos;s no way to recover (like OOM).  The ideal is to handle errors properly, possibly after ASSERTing on them if they should never happen, but this is sometimes not practical.

Is there more to say on the subject (beyond maybe a few examples and more clear language)?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>203522</commentid>
    <comment_count>13</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2010-03-24 11:48:57 -0700</bug_when>
    <thetext>A few thoughts.

ASSERT has no effect on production code; it is used during development to help us find programming mistakes.

CRASH has a direct effect on end users, and is used to gather information from the field and protect end users.

The benefits of a CRASH (not worded quite right):

    - Browser vendors will get crash reports from the field from our crash tracing technologies.
    - Code after the CRASH is guaranteed unreachable, which can help prevent some bugs from being security liabilities.

The cost of a CRASH:

    - Takes an internal programming error and turns it into a crash. Blows away at least a tab, and in some cases the entire web browser, in cases that otherwise might be harmless.

Then we need examples where an ASSERT is right, and examples where a CRASH is right.

And we need to explain the largest hazard for ASSERT: expressions inside the assertion are evaluated in debug builds but not in production code.

We also would want to explain ASSERT_UNUSED.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>203694</commentid>
    <comment_count>14</comment_count>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2010-03-24 17:17:21 -0700</bug_when>
    <thetext>&gt; We also would want to explain ASSERT_UNUSED.

Possibly also COMPILE_ASSERT, ASSERT_NOT_REACHED and ASSERT_ARG.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>206477</commentid>
    <comment_count>15</comment_count>
      <attachid>52156</attachid>
    <who name="Jeremy Moskovich">playmobil</who>
    <bug_when>2010-03-31 06:46:30 -0700</bug_when>
    <thetext>Created attachment 52156
Step 1 - Beef up documentation in Assertions.h</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>206478</commentid>
    <comment_count>16</comment_count>
      <attachid>52156</attachid>
    <who name="Jeremy Orlow">jorlow</who>
    <bug_when>2010-03-31 06:52:17 -0700</bug_when>
    <thetext>Comment on attachment 52156
Step 1 - Beef up documentation in Assertions.h

Looks good to me.  Will r+ tomorrow if no one has any feedback/objections in the mean time.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>206553</commentid>
    <comment_count>17</comment_count>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2010-03-31 09:49:06 -0700</bug_when>
    <thetext>&gt; CRASH should be used when we&apos;re reasonably sure something should
&gt; never happen but it happening would be _really_ bad.

ASSERT is compiled out of release builds for good reason -- if it were compiled in, WebKit would be slow. WebKit + Windows debug builds come with some many ASSERTs that a debug build is almost unusably slow.

So far, we&apos;ve used CRASH extremely sparingly, avoiding this performance problem. Specifically, we&apos;ve used ASSERT for problems that we don&apos;t expect to encounter, and CRASH for problems we know to be possible, like out-of-memory conditions.

I&apos;m very worried about the notion expressed here that we should have compile-time checks for all potentially bad errors. We can only afford these checks if the error would be bad enough, its likelihood is high enough, and the cost of checking is low enough.

+   For use when an unrecoverable error condition has occured.
+   Macro is enabled in both debug and release mode.

This comment would be better if it mentioned the performance cost of CRASH(), and suggested it be used sparingly. Something like, &quot;Use CRASH() for known, unrecoverable errors like out-of-memory. CRASH() is compiled into release builds, so it has a performance cost.&quot;

+/* ASSERT, ASSERT_NOT_REACHED, ASSERT_UNUSED
+
+  By default these macros are disabled in release mode, expressions inside the assertions are
+  similarly evaluated in debug builds but not in production code.

This is a run-on sentence. &quot;By default&quot; is confusing because it&apos;s not clear when the default is overridden. I would say, &quot;These macros are compiled out of release builds. Expressions inside them are evaluated in debug builds only.&quot;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>206643</commentid>
    <comment_count>18</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2010-03-31 12:31:44 -0700</bug_when>
    <thetext>(In reply to comment #17)
&gt; This comment would be better if it mentioned the performance cost of CRASH(),
&gt; and suggested it be used sparingly. Something like, &quot;Use CRASH() for known,
&gt; unrecoverable errors like out-of-memory. CRASH() is compiled into release
&gt; builds, so it has a performance cost.&quot;

While I agree with the sentiment, it&apos;s not the performance cost of CRASH that I think you&apos;re concerned about. It&apos;s the cost of the code that decides whether to invoke CRASH.

Geoff, maybe you can revise your suggested wording to be more accurate.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>206747</commentid>
    <comment_count>19</comment_count>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2010-03-31 15:03:02 -0700</bug_when>
    <thetext>(In reply to comment #18)
&gt; (In reply to comment #17)
&gt; &gt; This comment would be better if it mentioned the performance cost of CRASH(),
&gt; &gt; and suggested it be used sparingly. Something like, &quot;Use CRASH() for known,
&gt; &gt; unrecoverable errors like out-of-memory. CRASH() is compiled into release
&gt; &gt; builds, so it has a performance cost.&quot;
&gt; 

&gt; While I agree with the sentiment, it&apos;s not the performance cost of CRASH that I
&gt; think you&apos;re concerned about. It&apos;s the cost of the code that decides whether to
&gt; invoke CRASH.
&gt; 
&gt; Geoff, maybe you can revise your suggested wording to be more accurate.

Good point. How about: &quot;Use CRASH() in response to known, unrecoverable errors like out-of-memory. CRASH() is compiled into debug and release builds. To test for unknown errors and verify assumptions, use ASSERT instead, to avoid impacting performance in release builds.&quot;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>207053</commentid>
    <comment_count>20</comment_count>
      <attachid>52276</attachid>
    <who name="Jeremy Moskovich">playmobil</who>
    <bug_when>2010-04-01 01:26:02 -0700</bug_when>
    <thetext>Created attachment 52276
Step 1 - Beef up documentation in Assertions.h

Revised wording per Darin &amp; Geoffrey&apos; comments</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>207442</commentid>
    <comment_count>21</comment_count>
      <attachid>52276</attachid>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2010-04-01 15:34:45 -0700</bug_when>
    <thetext>Comment on attachment 52276
Step 1 - Beef up documentation in Assertions.h

r=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>208013</commentid>
    <comment_count>22</comment_count>
      <attachid>52276</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2010-04-02 12:51:44 -0700</bug_when>
    <thetext>Comment on attachment 52276
Step 1 - Beef up documentation in Assertions.h

Clearing flags on attachment: 52276

Committed r57016: &lt;http://trac.webkit.org/changeset/57016&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>208015</commentid>
    <comment_count>23</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2010-04-02 12:51:51 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>208028</commentid>
    <comment_count>24</comment_count>
    <who name="Jeremy Moskovich">playmobil</who>
    <bug_when>2010-04-02 13:12:37 -0700</bug_when>
    <thetext>Some more technical documentation still needed...</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>209022</commentid>
    <comment_count>25</comment_count>
    <who name="Jeremy Orlow">jorlow</who>
    <bug_when>2010-04-06 06:46:05 -0700</bug_when>
    <thetext>Please open a new bug for the subsequent patches.  You can link between them, but this should stay &apos;fixed&apos;.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>52156</attachid>
            <date>2010-03-31 06:46:30 -0700</date>
            <delta_ts>2010-04-01 01:26:33 -0700</delta_ts>
            <desc>Step 1 - Beef up documentation in Assertions.h</desc>
            <filename>assert.patch</filename>
            <type>text/plain</type>
            <size>2228</size>
            <attacher name="Jeremy Moskovich">playmobil</attacher>
            
              <data encoding="base64">Y29tbWl0IDlmNWU0NWU2NmUwYjJhOGE3MzUxYzIxZDEwYjk5ZmQ4OTEzNTYzNDcKQXV0aG9yOiBK
ZXJlbXkgTW9za292aWNoIDxwbGF5bW9iaWxAem9hbC50bHYuY29ycC5nb29nbGUuY29tPgpEYXRl
OiAgIFdlZCBNYXIgMzEgMTY6Mjc6NTcgMjAxMCArMDMwMAoKICAgIEFkZCBhIGJpdCBtb3JlIGRv
Y3VtZW50YXRpb24gdG8gQXNzZXJ0aW9ucy5oCgpkaWZmIC0tZ2l0IGEvSmF2YVNjcmlwdENvcmUv
Q2hhbmdlTG9nIGIvSmF2YVNjcmlwdENvcmUvQ2hhbmdlTG9nCmluZGV4IGRkZjJiYzEuLjBkYTQx
YWYgMTAwNjQ0Ci0tLSBhL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZworKysgYi9KYXZhU2NyaXB0
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwxMyBAQAorMjAxMC0wMy0zMSAgSmVyZW15IE1vc2tv
dmljaCAgPGplcmVteUBjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZ
IChPT1BTISkuCisKKyAgICAgICAgQmVlZiB1cCBkb2N1bWVudGF0aW9uIGZvciBBU1NFUlQqIGFu
ZCBDUkFTSCBtYWNyb3MgYSBiaXQuCisKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcv
c2hvd19idWcuY2dpP2lkPTM2NTI3CisKKyAgICAgICAgKiB3dGYvQXNzZXJ0aW9ucy5oOgorCiAy
MDEwLTAzLTMwICBHYXZpbiBCYXJyYWNsb3VnaCAgPGJhcnJhY2xvdWdoQGFwcGxlLmNvbT4KIAog
ICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKHdpbmRvd3MgYnVpbGQgZml4KS4KZGlmZiAtLWdp
dCBhL0phdmFTY3JpcHRDb3JlL3d0Zi9Bc3NlcnRpb25zLmggYi9KYXZhU2NyaXB0Q29yZS93dGYv
QXNzZXJ0aW9ucy5oCmluZGV4IDBlMDJhZjUuLjBiOGZkOTUgMTAwNjQ0Ci0tLSBhL0phdmFTY3Jp
cHRDb3JlL3d0Zi9Bc3NlcnRpb25zLmgKKysrIGIvSmF2YVNjcmlwdENvcmUvd3RmL0Fzc2VydGlv
bnMuaApAQCAtNTYsNiArNTYsNyBAQAogI2VuZGlmCiAKICNpZmRlZiBOREVCVUcKKy8qIERpc2Fi
bGUgQVNTRVJUKiBtYWNyb3MgaW4gcmVsZWFzZSBtb2RlLiAqLwogI2RlZmluZSBBU1NFUlRJT05T
X0RJU0FCTEVEX0RFRkFVTFQgMQogI2Vsc2UKICNkZWZpbmUgQVNTRVJUSU9OU19ESVNBQkxFRF9E
RUZBVUxUIDAKQEAgLTE0OCw4ICsxNDksMTMgQEAgdm9pZCBXVEZMb2dWZXJib3NlKGNvbnN0IGNo
YXIqIGZpbGUsIGludCBsaW5lLCBjb25zdCBjaGFyKiBmdW5jdGlvbiwgV1RGTG9nQ2hhbm4KIH0K
ICNlbmRpZgogCi0vKiBDUkFTSCAtLSBnZXRzIHVzIGludG8gdGhlIGRlYnVnZ2VyIG9yIHRoZSBj
cmFzaCByZXBvcnRlciAtLSBzaWduYWxzIGFyZSBpZ25vcmVkIGJ5IHRoZSBjcmFzaCByZXBvcnRl
ciBzbyB3ZSBtdXN0IGRvIGJldHRlciAqLworLyogQ1JBU0goKSAtIFJhaXNlcyBhIGZhdGFsIGVy
cm9yIHJlc3VsdGluZyBpbiBwcm9ncmFtIHRlcm1pbmF0aW9uIGFuZCB0cmlnZ2VyaW5nIGVpdGhl
ciB0aGUgZGVidWdnZXIgb3IgdGhlIGNyYXNoIHJlcG9ydGVyLgogCisgICBGb3IgdXNlIHdoZW4g
YW4gdW5yZWNvdmVyYWJsZSBlcnJvciBjb25kaXRpb24gaGFzIG9jY3VyZWQuCisgICBNYWNybyBp
cyBlbmFibGVkIGluIGJvdGggZGVidWcgYW5kIHJlbGVhc2UgbW9kZS4KKworICAgU2lnbmFscyBh
cmUgaWdub3JlZCBieSB0aGUgY3Jhc2ggcmVwb3J0ZXIgb24gT1MgWCBzbyB3ZSBtdXN0IGRvIGJl
dHRlci4KKyovCiAjaWZuZGVmIENSQVNICiAjaWYgT1MoU1lNQklBTikKICNkZWZpbmUgQ1JBU0go
KSBkbyB7IFwKQEAgLTE2NCw3ICsxNzAsMTEgQEAgdm9pZCBXVEZMb2dWZXJib3NlKGNvbnN0IGNo
YXIqIGZpbGUsIGludCBsaW5lLCBjb25zdCBjaGFyKiBmdW5jdGlvbiwgV1RGTG9nQ2hhbm4KICNl
bmRpZgogI2VuZGlmCiAKLS8qIEFTU0VSVCwgQVNTRVJUX05PVF9SRUFDSEVELCBBU1NFUlRfVU5V
U0VEICovCisvKiBBU1NFUlQsIEFTU0VSVF9OT1RfUkVBQ0hFRCwgQVNTRVJUX1VOVVNFRAorCisg
IEJ5IGRlZmF1bHQgdGhlc2UgbWFjcm9zIGFyZSBkaXNhYmxlZCBpbiByZWxlYXNlIG1vZGUsIGV4
cHJlc3Npb25zIGluc2lkZSB0aGUgYXNzZXJ0aW9ucyBhcmUKKyAgc2ltaWxhcmx5IGV2YWx1YXRl
ZCBpbiBkZWJ1ZyBidWlsZHMgYnV0IG5vdCBpbiBwcm9kdWN0aW9uIGNvZGUuCisqLwogCiAjaWYg
T1MoV0lOQ0UpICYmICFQTEFURk9STShUT1JDSE1PQklMRSkKIC8qIEZJWE1FOiBXZSBpbmNsdWRl
IHRoaXMgaGVyZSBvbmx5IHRvIGF2b2lkIGEgY29uZmxpY3Qgd2l0aCB0aGUgQVNTRVJUIG1hY3Jv
LiAqLwo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>52276</attachid>
            <date>2010-04-01 01:26:02 -0700</date>
            <delta_ts>2010-04-02 12:51:44 -0700</delta_ts>
            <desc>Step 1 - Beef up documentation in Assertions.h</desc>
            <filename>assert.patch</filename>
            <type>text/plain</type>
            <size>2322</size>
            <attacher name="Jeremy Moskovich">playmobil</attacher>
            
              <data encoding="base64">Y29tbWl0IDdmMGI3MzRlMTM1ZWM5YzZjMDgyMDljYmZiNzFlYTc0MmY1OTBiYzUKQXV0aG9yOiBK
ZXJlbXkgTW9za292aWNoIDxwbGF5bW9iaWxAem9hbC50bHYuY29ycC5nb29nbGUuY29tPgpEYXRl
OiAgIFdlZCBNYXIgMzEgMTY6Mjc6NTcgMjAxMCArMDMwMAoKICAgIEFkZCBhIGJpdCBtb3JlIGRv
Y3VtZW50YXRpb24gdG8gQXNzZXJ0aW9ucy5oCgpkaWZmIC0tZ2l0IGEvSmF2YVNjcmlwdENvcmUv
Q2hhbmdlTG9nIGIvSmF2YVNjcmlwdENvcmUvQ2hhbmdlTG9nCmluZGV4IGRkZjJiYzEuLjBkYTQx
YWYgMTAwNjQ0Ci0tLSBhL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZworKysgYi9KYXZhU2NyaXB0
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwxMyBAQAorMjAxMC0wMy0zMSAgSmVyZW15IE1vc2tv
dmljaCAgPGplcmVteUBjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZ
IChPT1BTISkuCisKKyAgICAgICAgQmVlZiB1cCBkb2N1bWVudGF0aW9uIGZvciBBU1NFUlQqIGFu
ZCBDUkFTSCBtYWNyb3MgYSBiaXQuCisKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcv
c2hvd19idWcuY2dpP2lkPTM2NTI3CisKKyAgICAgICAgKiB3dGYvQXNzZXJ0aW9ucy5oOgorCiAy
MDEwLTAzLTMwICBHYXZpbiBCYXJyYWNsb3VnaCAgPGJhcnJhY2xvdWdoQGFwcGxlLmNvbT4KIAog
ICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKHdpbmRvd3MgYnVpbGQgZml4KS4KZGlmZiAtLWdp
dCBhL0phdmFTY3JpcHRDb3JlL3d0Zi9Bc3NlcnRpb25zLmggYi9KYXZhU2NyaXB0Q29yZS93dGYv
QXNzZXJ0aW9ucy5oCmluZGV4IDBlMDJhZjUuLmRmODY0NmYgMTAwNjQ0Ci0tLSBhL0phdmFTY3Jp
cHRDb3JlL3d0Zi9Bc3NlcnRpb25zLmgKKysrIGIvSmF2YVNjcmlwdENvcmUvd3RmL0Fzc2VydGlv
bnMuaApAQCAtNTYsNiArNTYsNyBAQAogI2VuZGlmCiAKICNpZmRlZiBOREVCVUcKKy8qIERpc2Fi
bGUgQVNTRVJUKiBtYWNyb3MgaW4gcmVsZWFzZSBtb2RlLiAqLwogI2RlZmluZSBBU1NFUlRJT05T
X0RJU0FCTEVEX0RFRkFVTFQgMQogI2Vsc2UKICNkZWZpbmUgQVNTRVJUSU9OU19ESVNBQkxFRF9E
RUZBVUxUIDAKQEAgLTE0OCw4ICsxNDksMTQgQEAgdm9pZCBXVEZMb2dWZXJib3NlKGNvbnN0IGNo
YXIqIGZpbGUsIGludCBsaW5lLCBjb25zdCBjaGFyKiBmdW5jdGlvbiwgV1RGTG9nQ2hhbm4KIH0K
ICNlbmRpZgogCi0vKiBDUkFTSCAtLSBnZXRzIHVzIGludG8gdGhlIGRlYnVnZ2VyIG9yIHRoZSBj
cmFzaCByZXBvcnRlciAtLSBzaWduYWxzIGFyZSBpZ25vcmVkIGJ5IHRoZSBjcmFzaCByZXBvcnRl
ciBzbyB3ZSBtdXN0IGRvIGJldHRlciAqLworLyogQ1JBU0goKSAtIFJhaXNlcyBhIGZhdGFsIGVy
cm9yIHJlc3VsdGluZyBpbiBwcm9ncmFtIHRlcm1pbmF0aW9uIGFuZCB0cmlnZ2VyaW5nIGVpdGhl
ciB0aGUgZGVidWdnZXIgb3IgdGhlIGNyYXNoIHJlcG9ydGVyLgogCisgICBVc2UgQ1JBU0goKSBp
biByZXNwb25zZSB0byBrbm93biwgdW5yZWNvdmVyYWJsZSBlcnJvcnMgbGlrZSBvdXQtb2YtbWVt
b3J5LgorICAgTWFjcm8gaXMgZW5hYmxlZCBpbiBib3RoIGRlYnVnIGFuZCByZWxlYXNlIG1vZGUu
CisgICBUbyB0ZXN0IGZvciB1bmtub3duIGVycm9ycyBhbmQgdmVyaWZ5IGFzc3VtcHRpb25zLCB1
c2UgQVNTRVJUIGluc3RlYWQsIHRvIGF2b2lkIGltcGFjdGluZyBwZXJmb3JtYW5jZSBpbiByZWxl
YXNlIGJ1aWxkcy4KKworICAgU2lnbmFscyBhcmUgaWdub3JlZCBieSB0aGUgY3Jhc2ggcmVwb3J0
ZXIgb24gT1MgWCBzbyB3ZSBtdXN0IGRvIGJldHRlci4KKyovCiAjaWZuZGVmIENSQVNICiAjaWYg
T1MoU1lNQklBTikKICNkZWZpbmUgQ1JBU0goKSBkbyB7IFwKQEAgLTE2NCw3ICsxNzEsMTEgQEAg
dm9pZCBXVEZMb2dWZXJib3NlKGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lLCBjb25zdCBjaGFy
KiBmdW5jdGlvbiwgV1RGTG9nQ2hhbm4KICNlbmRpZgogI2VuZGlmCiAKLS8qIEFTU0VSVCwgQVNT
RVJUX05PVF9SRUFDSEVELCBBU1NFUlRfVU5VU0VEICovCisvKiBBU1NFUlQsIEFTU0VSVF9OT1Rf
UkVBQ0hFRCwgQVNTRVJUX1VOVVNFRAorCisgIFRoZXNlIG1hY3JvcyBhcmUgY29tcGlsZWQgb3V0
IG9mIHJlbGVhc2UgYnVpbGRzLgorICBFeHByZXNzaW9ucyBpbnNpZGUgdGhlbSBhcmUgZXZhbHVh
dGVkIGluIGRlYnVnIGJ1aWxkcyBvbmx5LgorKi8KIAogI2lmIE9TKFdJTkNFKSAmJiAhUExBVEZP
Uk0oVE9SQ0hNT0JJTEUpCiAvKiBGSVhNRTogV2UgaW5jbHVkZSB0aGlzIGhlcmUgb25seSB0byBh
dm9pZCBhIGNvbmZsaWN0IHdpdGggdGhlIEFTU0VSVCBtYWNyby4gKi8K
</data>

          </attachment>
      

    </bug>

</bugzilla>