tbxml fuite logic error

paddevpaddev Membre
novembre 2011 modifié dans Apple Developer Programs #1
Bonjour,

J'ai quelques probleme de leak avec le parser TBXML.
Quand je fais 'analyse" pour verifier mon code, j'ai ceci:

Dans le fichier TBXML.m :
<br />BOOL selfClosingElement = NO;<br />&nbsp; &nbsp; &nbsp; &nbsp; if (*(elementEnd-1) == &#039;/&#039;) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // ici logic error: dereference of null pointer<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; selfClosingElement = YES;<br />&nbsp; &nbsp; &nbsp; &nbsp; }<br />&nbsp; &nbsp; &nbsp;  <br /><br />Dans le fichier NSDataAdditions.m:<br /><br />if( ixinbuf == 4 ) {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ixinbuf = 0;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; outbuf [0] = ( inbuf[0] &lt;&lt; 2 ) | ( ( inbuf[1] &amp; 0x30) &gt;&gt; 4 );&nbsp; &nbsp; &nbsp;  //ici the left operand of&quot;&amp;&quot; is a garbage value<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; outbuf [1] = ( ( inbuf[1] &amp; 0x0F ) &lt;&lt; 4 ) | ( ( inbuf[2] &amp; 0x3C ) &gt;&gt; 2 );&nbsp; &nbsp; &nbsp; &nbsp; //ici the left operand of&quot;&amp;&quot; is a garbage value<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; outbuf [2] = ( ( inbuf[2] &amp; 0x03 ) &lt;&lt; 6 ) | ( inbuf[3] &amp; 0x3F );<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for( i = 0; i &lt; ctcharsinbuf; i++ )<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [mutableData appendBytes:&amp;outbuf[i] length:1];<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br />



Quelqu'un a deja eu ce souci.
J'ai ce probleme depuis que je suis passé a la dernière version de xcode.
Merci d'avance pour votre aide!

Réponses

  • AliGatorAliGator Membre, Modérateur
    21:57 modifié #2
    Ton code est illisible merci d'éditer tes posts pour encadrer ton code des balises adéquates (utilise les boutons au dessus de la zone de redaction comme sur n'importe quel forum)
  • CéroceCéroce Membre, Modérateur
    21:57 modifié #3
    Le code est trop incomplet pour que nous puission répondre.
  • paddevpaddev Membre
    21:57 modifié #4
    Voila le code complet du fichier NsDateAdditions.m de tbxml:

    <br />#import &quot;NSDataAdditions.h&quot;<br /><br />#import &lt;zlib.h&gt;<br /><br /><br />@implementation NSData (NSDataAdditions)<br /><br />+ (NSData *) dataWithUncompressedContentsOfFile:(NSString *)aFile {<br />	<br />	NSData * result;<br /><br />	if ([[aFile pathExtension] isEqualToString:@&quot;gz&quot;]) {<br />		NSData * compressedData = [NSData dataWithContentsOfFile:aFile];<br />		result = [compressedData gzipInflate];<br />	}<br />	else<br />		result = [NSData dataWithContentsOfFile:aFile];<br /><br />&nbsp; &nbsp; return result;<br />}<br /><br /><br /><br /><br /><br /><br />static char encodingTable[64] = {<br />	&#039;A&#039;,&#039;B&#039;,&#039;C&#039;,&#039;D&#039;,&#039;E&#039;,&#039;F&#039;,&#039;G&#039;,&#039;H&#039;,&#039;I&#039;,&#039;J&#039;,&#039;K&#039;,&#039;L&#039;,&#039;M&#039;,&#039;N&#039;,&#039;O&#039;,&#039;P&#039;,<br />	&#039;Q&#039;,&#039;R&#039;,&#039;S&#039;,&#039;T&#039;,&#039;U&#039;,&#039;V&#039;,&#039;W&#039;,&#039;X&#039;,&#039;Y&#039;,&#039;Z&#039;,&#039;a&#039;,&#039;b&#039;,&#039;c&#039;,&#039;d&#039;,&#039;e&#039;,&#039;f&#039;,<br />	&#039;g&#039;,&#039;h&#039;,&#039;i&#039;,&#039;j&#039;,&#039;k&#039;,&#039;l&#039;,&#039;m&#039;,&#039;n&#039;,&#039;o&#039;,&#039;p&#039;,&#039;q&#039;,&#039;r&#039;,&#039;s&#039;,&#039;t&#039;,&#039;u&#039;,&#039;v&#039;,<br />	&#039;w&#039;,&#039;x&#039;,&#039;y&#039;,&#039;z&#039;,&#039;0&#039;,&#039;1&#039;,&#039;2&#039;,&#039;3&#039;,&#039;4&#039;,&#039;5&#039;,&#039;6&#039;,&#039;7&#039;,&#039;8&#039;,&#039;9&#039;,&#039;+&#039;,&#039;/&#039; };<br /><br /><br />+ (NSData *) dataWithBase64EncodedString:(NSString *) string {<br />&nbsp; &nbsp; NSData *result = [[NSData alloc] initWithBase64EncodedString:string];<br />&nbsp; &nbsp; return result;<br />}<br /><br />- (id) initWithBase64EncodedString:(NSString *) string {<br />&nbsp; &nbsp; NSMutableData *mutableData = nil;<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; if( string ) {<br />&nbsp; &nbsp; &nbsp; &nbsp; unsigned long ixtext = 0;<br />&nbsp; &nbsp; &nbsp; &nbsp; unsigned long lentext = 0;<br />&nbsp; &nbsp; &nbsp; &nbsp; unsigned char ch = 0;<br />&nbsp; &nbsp; &nbsp; &nbsp; unsigned char inbuf[4], outbuf[3];<br />&nbsp; &nbsp; &nbsp; &nbsp; short i = 0, ixinbuf = 0;<br />&nbsp; &nbsp; &nbsp; &nbsp; BOOL flignore = NO;<br />&nbsp; &nbsp; &nbsp; &nbsp; BOOL flendtext = NO;<br />&nbsp; &nbsp; &nbsp; &nbsp; NSData *base64Data = nil;<br />&nbsp; &nbsp; &nbsp; &nbsp; const unsigned char *base64Bytes = nil;<br />&nbsp; &nbsp; &nbsp; &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; // Convert the string to ASCII data.<br />&nbsp; &nbsp; &nbsp; &nbsp; base64Data = [string dataUsingEncoding:NSASCIIStringEncoding];<br />&nbsp; &nbsp; &nbsp; &nbsp; base64Bytes = [base64Data bytes];<br />&nbsp; &nbsp; &nbsp; &nbsp; mutableData = [NSMutableData dataWithCapacity:[base64Data length]];<br />&nbsp; &nbsp; &nbsp; &nbsp; lentext = [base64Data length];<br />&nbsp; &nbsp; &nbsp; &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; while( YES ) {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if( ixtext &gt;= lentext ) break;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ch = base64Bytes[ixtext++];<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; flignore = NO;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if( ( ch &gt;= &#039;A&#039; ) &amp;&amp; ( ch &lt;= &#039;Z&#039; ) ) ch = ch - &#039;A&#039;;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else if( ( ch &gt;= &#039;a&#039; ) &amp;&amp; ( ch &lt;= &#039;z&#039; ) ) ch = ch - &#039;a&#039; + 26;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else if( ( ch &gt;= &#039;0&#039; ) &amp;&amp; ( ch &lt;= &#039;9&#039; ) ) ch = ch - &#039;0&#039; + 52;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else if( ch == &#039;+&#039; ) ch = 62;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else if( ch == &#039;=&#039; ) flendtext = YES;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else if( ch == &#039;/&#039; ) ch = 63;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else flignore = YES; <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if( ! flignore ) {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; short ctcharsinbuf = 3;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; BOOL flbreak = NO;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if( flendtext ) {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if( ! ixinbuf ) break;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if( ( ixinbuf == 1 ) || ( ixinbuf == 2 ) ) ctcharsinbuf = 1;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else ctcharsinbuf = 2;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ixinbuf = 3;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; flbreak = YES;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; inbuf [ixinbuf++] = ch;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if( ixinbuf == 4 ) {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ixinbuf = 0;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; outbuf [0] = ( inbuf[0] &lt;&lt; 2 ) | ( ( inbuf[1] &amp; 0x30) &gt;&gt; 4 );&nbsp; &nbsp; //logic error ici: the left operand of&quot;&amp;&quot; is a garbage value<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; outbuf [1] = ( ( inbuf[1] &amp; 0x0F ) &lt;&lt; 4 ) | ( ( inbuf[2] &amp; 0x3C ) &gt;&gt; 2 );&nbsp;  //logic error ici: the left operand of&quot;&amp;&quot; is a garbage value<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; outbuf [2] = ( ( inbuf[2] &amp; 0x03 ) &lt;&lt; 6 ) | ( inbuf[3] &amp; 0x3F );<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for( i = 0; i &lt; ctcharsinbuf; i++ ) <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [mutableData appendBytes:&amp;outbuf[i] length:1];<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if( flbreak )&nbsp; break;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br />&nbsp; &nbsp; &nbsp; &nbsp; }<br />&nbsp; &nbsp; }<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; self = [self initWithData:mutableData];<br />&nbsp; &nbsp; return self;<br />}<br /><br />#pragma mark -<br /><br />- (NSString *) base64Encoding {<br />&nbsp; &nbsp; return [self base64EncodingWithLineLength:0];<br />}<br /><br />- (NSString *) base64EncodingWithLineLength:(unsigned int) lineLength {<br />&nbsp; &nbsp; const unsigned char&nbsp; &nbsp; *bytes = [self bytes];<br />&nbsp; &nbsp; NSMutableString *result = [NSMutableString stringWithCapacity:[self length]];<br />&nbsp; &nbsp; unsigned long ixtext = 0;<br />&nbsp; &nbsp; unsigned long lentext = [self length];<br />&nbsp; &nbsp; long ctremaining = 0;<br />&nbsp; &nbsp; unsigned char inbuf[3], outbuf[4];<br />&nbsp; &nbsp; short i = 0;<br />&nbsp; &nbsp; short charsonline = 0, ctcopy = 0;<br />&nbsp; &nbsp; unsigned long ix = 0;<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; while( YES ) {<br />&nbsp; &nbsp; &nbsp; &nbsp; ctremaining = lentext - ixtext;<br />&nbsp; &nbsp; &nbsp; &nbsp; if( ctremaining &lt;= 0 ) break;<br />&nbsp; &nbsp; &nbsp; &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; for( i = 0; i &lt; 3; i++ ) {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ix = ixtext + i;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if( ix &lt; lentext ) inbuf[i] = bytes[ix];<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else inbuf [i] = 0;<br />&nbsp; &nbsp; &nbsp; &nbsp; }<br />&nbsp; &nbsp; &nbsp; &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; outbuf [0] = (inbuf [0] &amp; 0xFC) &gt;&gt; 2;<br />&nbsp; &nbsp; &nbsp; &nbsp; outbuf [1] = ((inbuf [0] &amp; 0x03) &lt;&lt; 4) | ((inbuf [1] &amp; 0xF0) &gt;&gt; 4);<br />&nbsp; &nbsp; &nbsp; &nbsp; outbuf [2] = ((inbuf [1] &amp; 0x0F) &lt;&lt; 2) | ((inbuf [2] &amp; 0xC0) &gt;&gt; 6);<br />&nbsp; &nbsp; &nbsp; &nbsp; outbuf [3] = inbuf [2] &amp; 0x3F;<br />&nbsp; &nbsp; &nbsp; &nbsp; ctcopy = 4;<br />&nbsp; &nbsp; &nbsp; &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; switch( ctremaining ) {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; case 1: <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ctcopy = 2; <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; case 2: <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ctcopy = 3; <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;<br />&nbsp; &nbsp; &nbsp; &nbsp; }<br />&nbsp; &nbsp; &nbsp; &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; for( i = 0; i &lt; ctcopy; i++ )<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [result appendFormat:@&quot;%c&quot;, encodingTable[outbuf[i]]];<br />&nbsp; &nbsp; &nbsp; &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; for( i = ctcopy; i &lt; 4; i++ )<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [result appendFormat:@&quot;%c&quot;,&#039;=&#039;];<br />&nbsp; &nbsp; &nbsp; &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; ixtext += 3;<br />&nbsp; &nbsp; &nbsp; &nbsp; charsonline += 4;<br />&nbsp; &nbsp; &nbsp; &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; if( lineLength &gt; 0 ) {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (charsonline &gt;= lineLength) {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; charsonline = 0;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [result appendString:@&quot;&#092;n&quot;];<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br />&nbsp; &nbsp; &nbsp; &nbsp; }<br />&nbsp; &nbsp; }<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; return result;<br />}<br /><br /><br /><br />// ================================================================================================<br />//&nbsp; NSData+gzip.m<br />//&nbsp; Drip<br />//<br />//&nbsp; Created by Nur Monson on 8/21/07.<br />//&nbsp; Copyright 2007 theidiotproject. All rights reserved.<br />//<br />//&nbsp; FOUND HERE http://code.google.com/p/drop-osx/source/browse/trunk/Source/NSData%2Bgzip.m<br />//<br />//&nbsp; Also Check http://deusty.blogspot.com/2007/07/gzip-compressiondecompression.html<br />// ================================================================================================<br /><br />#pragma mark -<br />#pragma mark GZIP<br /><br />- (NSData *)gzipDeflate<br />{<br />	if ([self length] == 0) return self;<br />	<br />	z_stream strm;<br />	<br />	strm.zalloc = Z_NULL;<br />	strm.zfree = Z_NULL;<br />	strm.opaque = Z_NULL;<br />	strm.total_out = 0;<br />	strm.next_in=(Bytef *)[self bytes];<br />	strm.avail_in = [self length];<br />	<br />	// Compresssion Levels:<br />	//&nbsp;  Z_NO_COMPRESSION<br />	//&nbsp;  Z_BEST_SPEED<br />	//&nbsp;  Z_BEST_COMPRESSION<br />	//&nbsp;  Z_DEFAULT_COMPRESSION<br />	<br />	if (deflateInit2(&amp;strm, Z_DEFAULT_COMPRESSION, Z_DEFLATED, (15+16), 8, Z_DEFAULT_STRATEGY) != Z_OK) return nil;<br />	<br />	NSMutableData *compressed = [NSMutableData dataWithLength:16384];&nbsp; // 16K chunks for expansion<br />	<br />	do {<br />		<br />		if (strm.total_out &gt;= [compressed length])<br />			[compressed increaseLengthBy: 16384];<br />		<br />		strm.next_out = [compressed mutableBytes] + strm.total_out;<br />		strm.avail_out = [compressed length] - strm.total_out;<br />		<br />		deflate(&amp;strm, Z_FINISH);&nbsp; <br />		<br />	} while (strm.avail_out == 0);<br />	<br />	deflateEnd(&amp;strm);<br />	<br />	[compressed setLength: strm.total_out];<br />	return [NSData dataWithData:compressed];<br />}<br /><br />- (NSData *)gzipInflate<br />{<br />	if ([self length] == 0) return self;<br />	<br />	unsigned full_length = [self length];<br />	unsigned half_length = [self length] / 2;<br />	<br />	NSMutableData *decompressed = [NSMutableData dataWithLength: full_length + half_length];<br />	BOOL done = NO;<br />	int status;<br />	<br />	z_stream strm;<br />	strm.next_in = (Bytef *)[self bytes];<br />	strm.avail_in = [self length];<br />	strm.total_out = 0;<br />	strm.zalloc = Z_NULL;<br />	strm.zfree = Z_NULL;<br />	<br />	if (inflateInit2(&amp;strm, (15+32)) != Z_OK) return nil;<br />	while (!done)<br />	{<br />		// Make sure we have enough room and reset the lengths.<br />		if (strm.total_out &gt;= [decompressed length])<br />			[decompressed increaseLengthBy: half_length];<br />		strm.next_out = [decompressed mutableBytes] + strm.total_out;<br />		strm.avail_out = [decompressed length] - strm.total_out;<br />		<br />		// Inflate another chunk.<br />		status = inflate (&amp;strm, Z_SYNC_FLUSH);<br />		if (status == Z_STREAM_END) done = YES;<br />		else if (status != Z_OK) break;<br />	}<br />	if (inflateEnd (&amp;strm) != Z_OK) return nil;<br />	<br />	// Set real length.<br />	if (done)<br />	{<br />		[decompressed setLength: strm.total_out];<br />		return [NSData dataWithData: decompressed];<br />	}<br />	else return nil;<br />}<br /><br />@end<br /><br />
    
Connectez-vous ou Inscrivez-vous pour répondre.